partition exchange

SY
Дата: 29.11.2012 18:28:34
Версия:

+
SQL> select  *
  2    from  v$version
  3  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> 


Почему-то считал что partition exchange будучи физической операцией выдаст ошибку если сессия 1 откроет курсор на выборку из партиции затем сессия 2 сделает partition exchange после чего сессия 1 попытается фетчить из курсора. Т.е. примерно то же что и с truncate:

+
SQL> -- session 1
SQL> truncate table range_sales;

Table truncated.

SQL> insert
  2    into range_sales
  3    select level,1,date '2000-02-01','A',1,1,1
  4      from dual
  5      connect by level <= 100
  6  /

100 rows created.

SQL> commit;

Commit complete.

SQL> variable v_cur refcursor
SQL> exec open :v_cur for select * from range_sales partition(sales_q1_2000);

PL/SQL procedure successfully completed.


+
SQL> -- session 2
SQL> alter table range_sales truncate partition sales_q1_2000; -- OR: truncate table range_sales;

Table truncated.

SQL> 


+
SQL> -- session 1
SQL> print v_cur
ERROR:
ORA-08103: object no longer exists


Oднако:

SQL> -- session 1
SQL> truncate table range_sales;

Table truncated.

SQL> insert
  2    into range_sales
  3    select level,1,date '2000-02-01','A',1,1,1
  4      from dual
  5      connect by level <= 100
  6  /

100 rows created.

SQL> commit;

Commit complete.

SQL> variable v_cur refcursor
SQL> exec open :v_cur for select * from range_sales partition(sales_q1_2000);

PL/SQL procedure successfully completed.


SQL> -- session2
SQL> truncate table range_sales_exchange;

Table truncated.

SQL> alter table range_sales
  2    exchange partition sales_q1_2000
  3    with table range_sales_exchange
  4  /

Table altered.

SQL> select  count(*)
  2    from  range_sales_exchange
  3  /

  COUNT(*)
----------
       100

SQL> select  count(*)
  2    from  range_sales partition(sales_q1_2000)
  3  /

  COUNT(*)
----------
         0

SQL> update range_sales_exchange
  2     set time_id = sysdate
  3  /

100 rows updated.

SQL> commit
  2  /

Commit complete.

SQL> 


SQL> -- session1
SQL> print v_cur

   PROD_ID    CUST_ID TIME_ID   C   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- - ---------- ------------- -----------
         1          1 01-FEB-00 A          1             1           1
         2          1 01-FEB-00 A          1             1           1
         3          1 01-FEB-00 A          1             1           1
         4          1 01-FEB-00 A          1             1           1
         5          1 01-FEB-00 A          1             1           1
.
.
.
        99          1 01-FEB-00 A          1             1           1

   PROD_ID    CUST_ID TIME_ID   C   PROMO_ID QUANTITY_SOLD AMOUNT_SOLD
---------- ---------- --------- - ---------- ------------- -----------
       100          1 01-FEB-00 A          1             1           1

100 rows selected.

SQL> 


SY.
P.S. Таблица range_sales из доки.
Деев И.
Дата: 29.11.2012 22:35:11
Так давно уж работает. Чистили старые секции через обработку старых данных в новом сегменте и exchange partition без остановки...
SY
Дата: 30.11.2012 00:55:30
Разобрался. Partition exchange пристегивает сегмент партиции к таблице и сегмент таблицы к партиции. Курсор содержит пойнтер на сегмент партиции и чешет по нему хотя он партиции уже не принадлежит. А с update exchange таблицы я явно лоханулся. Надо было делать truncate - он же достает старые данные из undo:

SQL> -- session2
SQL> alter table range_sales
  2    exchange partition sales_q1_2000
  3    with table range_sales_exchange
  4  /

Table altered.

SQL> truncate table range_sales_exchange;

Table truncated.

SQL> 


SQL> -- session1
SQL> print v_cur
ERROR:
ORA-08103: object no longer exists



no rows selected

SQL> 


SY.
Sayan Malakshinov
Дата: 30.11.2012 01:06:11
Деев И.
Так давно уж работает. Чистили старые секции через обработку старых данных в новом сегменте и exchange partition без остановки...
не совсем понятно, что значило чистили? Ctas c фильтрацией и exchange partition понимаю, а если ctas, delete, shrink,exchange - не очень
Деев И.
Дата: 30.11.2012 10:55:23
Да, пардон, неясно выразился.
Именно ctas c фильтрацией и exchange partition, в 8i
При этом открытые курсоры обрабатываются нормально, поскольку смена названий сегментов в словаре на них уже не влияет. Т.е. безопасно получается.
SY
Дата: 30.11.2012 19:07:26
Деев И.
Т.е. безопасно получается.


Получается partition exchange есть некая смесь физической и логической операции. Т.е. операция физическая а её последствия на read consistency как и у логической. DDL последствия которого как и у DML. Ну и конечно-же не документировано.

SY.
Серафимный Шестикрыл
Дата: 30.11.2012 19:12:54
SY
Получается partition exchange есть некая смесь физической и логической операции.


А что в данном случае подразумевается под физикой ? При exchange partition меняются метаданные словаря.
SY
Дата: 30.11.2012 19:57:02
Серафимный Шестикрыл
А что в данном случае подразумевается под физикой ? При exchange partition меняются метаданные словаря.


Да, ты прав никакой "физики" как например при truncate тут нет. Так-что получается что для уже открытых курсоров те же "правила" как и при alter table.

SY.