INTERVAL分割槽表鎖分割槽操作

yangtingkun發表於2010-03-10

在文件中,對INTERVAL分割槽執行一些操作之前都會先執行分割槽的鎖定操作。

 

 

和其他型別的分割槽表不同,INTERVAL分割槽表的分割槽並不一定是已經存在的,分割槽是否存在與使用者插入的資料的範圍有關。

可以看到,文件在對INTERVAL分割槽執行SPLIT等分割槽操作之前都會執行一個鎖分割槽的操作,事實上這個鎖操作並非是避免使用者DMLDDL操作的影響,而是為了確保要操作的分割槽存在:

SQL> CREATE TABLE T_PART_INTER
  2  (ID NUMBER,
  3  NAME VARCHAR2(30),
  4  CREATE_DATE DATE)
  5  PARTITION BY RANGE (ID)
  6  INTERVAL (100)
  7  (PARTITION P1 VALUES LESS THAN (100),
  8  PARTITION P2 VALUES LESS THAN (200));

表已建立。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
  2  FROM USER_TAB_PARTITIONS
  3  WHERE TABLE_NAME = 'T_PART_INTER';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE
--------------- --------------- ----------------------------------------
T_PART_INTER    P1              100
T_PART_INTER    P2              200

SQL> ALTER TABLE T_PART_INTER
  2  MOVE PARTITION FOR(250);
ALTER TABLE T_PART_INTER
            *
1 行出現錯誤:
ORA-02149:
指定的分割槽不存在


SQL> LOCK TABLE T_PART_INTER
  2  PARTITION FOR(250)
  3  IN SHARE MODE;

表已鎖定。

SQL> ALTER TABLE T_PART_INTER
  2  MOVE PARTITION FOR(250);

表已更改。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
  2  FROM USER_TAB_PARTITIONS
  3  WHERE TABLE_NAME = 'T_PART_INTER';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE
--------------- --------------- ----------------------------------------
T_PART_INTER    P1              100
T_PART_INTER    P2              200
T_PART_INTER    SYS_P102        300

可以看到,LOCK TABLE使得Oracle新增了INTERVAL分割槽。

從這個現象推測,新增資料會導致INTERVAL新增分割槽,LOCK PARTITION也會導致新增分割槽,而新增資料會導致LOCK PARTITION,那麼Oracle很可能是在監測到鎖分割槽的操作之後對INTERVAL分割槽進行了新增操作。

SQL> LOCK TABLE T_PART_INTER
  2  PARTITION FOR (320)
  3  IN ROW SHARE MODE;

表已鎖定。

SQL> LOCK TABLE T_PART_INTER
  2  PARTITION FOR (430)
  3  IN ROW EXCLUSIVE MODE;

表已鎖定。

SQL> LOCK TABLE T_PART_INTER
  2  PARTITION FOR (560)
  3  IN SHARE ROW EXCLUSIVE MODE;

表已鎖定。

SQL> LOCK TABLE T_PART_INTER
  2  PARTITION FOR (670)
  3  IN EXCLUSIVE MODE;

表已鎖定。

SQL> LOCK TABLE T_PART_INTER
  2  PARTITION FOR (780)
  3  IN SHARE UPDATE MODE;

表已鎖定。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
  2  FROM USER_TAB_PARTITIONS
  3  WHERE TABLE_NAME = 'T_PART_INTER';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE
--------------- --------------- ----------------------------------------
T_PART_INTER    P1              100
T_PART_INTER    P2              200
T_PART_INTER    SYS_P102        300
T_PART_INTER    SYS_P103        400
T_PART_INTER    SYS_P104        500
T_PART_INTER    SYS_P105        600
T_PART_INTER    SYS_P106        700
T_PART_INTER    SYS_P107        800

已選擇8行。

可以看到,由LOCK TABLE引發的任何模式的鎖操作,都會導致INTERVAL分割槽的新增,但是,SELECT FOR UPDATE操作並不會引發這個操作:

SQL> SELECT *
  2  FROM T_PART_INTER
  3  PARTITION FOR(890)
  4  FOR UPDATE;

未選定行

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE
  2  FROM USER_TAB_PARTITIONS
  3  WHERE TABLE_NAME = 'T_PART_INTER';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE
--------------- --------------- ----------------------------------------
T_PART_INTER    P1              100
T_PART_INTER    P2              200
T_PART_INTER    SYS_P102        300
T_PART_INTER    SYS_P103        400
T_PART_INTER    SYS_P104        500
T_PART_INTER    SYS_P105        600
T_PART_INTER    SYS_P106        700
T_PART_INTER    SYS_P107        800

已選擇8行。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-629177/,如需轉載,請註明出處,否則將追究法律責任。

相關文章