oracle 取消 interval分区,Oracle INTERVAL分区表锁分区操作

在文档中,对INTERVAL分区执行一些操作之前都会先执行分区的锁定操作。

和其他类型的分区表不同,INTERVAL分区表的分区并不一定是已经存在的,分区是否存在与用户插入的数据的范围有关。

可以看到,文档在对INTERVAL分区执行SPLIT等分区操作之前都会执行一个锁分区的操作,事实上这个锁操作并非是避免用户DML对DDL操作的影响,而是为了确保要操作的分区存在:

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行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值