专栏首页bisal的个人杂货铺truncate分区表的操作,会导致全局索引失效?

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

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

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,则涉及的局部索引会失效,涉及的全局索引会标记为失效,需要重建,对索引组织表,局部索引的效果和堆表相同,但是全局索引仍可用,

分区表执行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_sale
  2      ( prod_id        NUMBER(6)
  3      , cust_id        NUMBER
  4      , time_id        DATE
  5      )
  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 deleted


SQL> 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

bisal 博客专家

发布了512 篇原创文章 · 获赞 492 · 访问量 200万+

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 存在外键关联的主表truncate如何做

    我认为需要根据实际情况进行取舍,例如表不复杂,可以由应用实现,若表之间关联较多且复杂,那么交由数据库处理,至少保证不会错。

    bisal
  • 一个触发器需求的案例

    我对触发器,了解非常有限,只能试着来,乍一看判断空,即NULL,是不能用“=”,需要使用IS NULL/IS NOT NULL,改了一下,执行报错,

    bisal
  • truncate表,会将统计信息清除么?

    说明执行truncate,表的统计信息不会被删除,除非执行了统计信息采集,truncate table和表和索引的统计信息,没有任何关联。

    bisal
  • ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • 如何在CDH集群中部署Presto

    Fayson
  • 巧用parallel极速提升数据加载速度(r2第21天)

    并行在平时工作中可能不是很注意,因为有时候即使设定了parallel 相关的hint,感觉性能也好不到哪去。这是我以前的感觉。 今天通过一个案例来分享一下通过p...

    jeanron100
  • 小白博客 kali Linux系统下Joomscan工具的使用方法

    Joomscan 由于其灵活性,Joomla可能是使用最广泛的CMS。对于这个CMS,它是一个Joomla扫描仪。 它将帮助网络开发人员和网站管理员帮助确...

    奶糖味的代言
  • 当心外部连接中的ON子句

           在SQL tuning中,不良写法导致SQL执行效率比比皆是。最近的SQL tuning中一个外部连接写法不当导致过SQL执行时间超过15分钟左右...

    Leshami
  • 性能分析之一条SQL引起的内存溢出问题

    今天在测试环境有过代码升级。升级后,在群里有人反映系统访问很慢。运维人员反映服务器cpu使用率很高。

    高楼Zee
  • python 创建自己的包

    创建一个文件夹:mymath,在该文件夹下创建三个python 文件,分别为:__init__.py   getMax.py     getMin.py

    py3study

扫码关注云+社区

领取腾讯云代金券