mysql truncate 索引_truncate分区表的操作,会导致全局索引失效?

今天看到《删除分区如何不让全局索引失效?》这篇文章有朋友提了个问题,

44a46eb60e2c63bfb3c28d5d0d6c51cd.png

truncate是删除数据操作,但他是DDL语句,不是delete这种DML语句,不会写redo和undo,不能rollback。

官方文档,已经明确指出,除非使用update indexes,否则用truncate分区表,就会导致全局索引失效,必须重建,

Unless you specify UPDATE INDEXES, any global indexes are marked UNUSABLE and must be rebuilt. (You cannot use UPDATE INDEXES for index-organized tables. Use UPDATE GLOBAL INDEXES instead.)

在alter table分区表的操作中带着update indexes,就会让Oracle在执行DDL语句的同时,更新索引,当然这会让alter table执行的时间更长。这就是所谓“甘蔗没有两头甜”。

扩展一下,对堆表来说,alter table不带update indexes,则涉及的局部索引会失效,涉及的全局索引会标记为失效,需要重建,对索引组织表,局部索引的效果和堆表相同,但是全局索引仍可用,

268263e6b6303c30909674d63042cb7e.png

分区表执行drop、truncate、exchange这些DDL操作,不再是快速操作,他的时间就需要衡量了,因为会导致全局索引的失效,需要重建索引,

The DROP, TRUNCATE, and EXCHANGE operations are no longer fast operations. Again, you must compare the time it takes to do the DDL and then rebuild all indexes.

最简单的方式,当然就是测试,实践是检验真理的唯一标准。

创建测试表、测试数据,

SQL> CREATE TABLE interval_sale2 ( prod_id NUMBER(6)3 , cust_id NUMBER4 , time_id DATE5 )6 PARTITION BY RANGE (time_id)7 INTERVAL(NUMTOYMINTERVAL(1, 'YEAR'))8 (PARTITION p0 VALUES LESS THAN (TO_DATE('1-1-2003', 'DD-MM-YYYY')),9 PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2004', 'DD-MM-YYYY')),10 PARTITION p2 VALUES LESS THAN (TO_DATE('1-1-2005', 'DD-MM-YYYY')),11         PARTITION p3 VALUES LESS THAN (TO_DATE('1-1-2006', 'DD-MM-YYYY')));Table created.SQL> insert into interval_sale values(1, 1, to_date('2002-01-01','yyyy-mm-dd'));1 row created.SQL> insert into interval_sale values(2, 2, to_date('2003-01-01','yyyy-mm-dd'));1 row created.SQL> insert into interval_sale values(3, 3, to_date('2004-01-01','yyyy-mm-dd'));1 row created.SQL> insert into interval_sale values(4, 4, to_date('2005-01-01','yyyy-mm-dd'));1 row created.SQL> commit;Commit complete.

创建全局索引,

SQL> create index idx_01 on interval_sale(cust_id);Index created.SQL> select table_name, index_name, partitioned, status from user_indexes where table_name='INTERVAL_SALE';TABLE_NAME       INDEX_NAME     PAR  STATUS--------------- --------------- --- --------INTERVAL_SALE      IDX_01       NO    VALID

执行truncate,不带update indexes,

SQL> alter table interval_sale truncate partition p1;Table truncated.

此时索引状态,UNUSABLE,

SQL> select table_name, index_name, partitioned, status from user_indexes where table_name='INTERVAL_SALE';TABLE_NAME       INDEX_NAME   PAR  STATUS--------------- ------------- --- --------INTERVAL_SALE    IDX_01       NO  UNUSABLE

如果用了update indexes,全局索引状态,仍是VALID,

SQL> alter table interval_sale truncate partition p3 update indexes;Table truncated.SQL> select table_name, index_name, partitioned, status from user_indexes where table_name='INTERVAL_SALE';TABLE_NAME        INDEX_NAME   PAR  STATUS---------------- ------------- --- --------INTERVAL_SALE       IDX_01     NO   VALID

当然,按照《删除分区如何不让全局索引失效?》逻辑,执行delete,再执行truncate,

SQL> delete from interval_sale partition (p0);2 rows deletedSQL> alter table interval_sale truncate partition p0;Table truncated.

此时全局索引状态还是VALID,但是这种操作,没什么实际意义,

SQL> select table_name, index_name, partitioned, status from user_indexes where table_name='INTERVAL_SALE';TABLE_NAME       INDEX_NAME   PAR  STATUS--------------- ------------- --- --------INTERVAL_SALE      IDX_01     NO   VALID

近期热文:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值