前两天做一个大的分区表的数据清理,split 分区后,忘记rebuild 索引,导致生产库查询的分区表非常的缓慢
对分区表某个分区做split ,如果没有在alter table 语句最后加上update indexes,被分裂出的两个分区的本地索引和整个表的全局索引都会失效。
当根据索引字段查询分区表数据时,如果某个分区的本地索引失效,那么没有索引失效的分区走本地索引查询,索引失效的分区走全分区扫描,恰巧这个分区很大,直接拖累了整个查询速度,当然如果知道自己要查询的数据在具体哪个分区,指定分区查询走本地索引,即便其他分区索引失效也不会影响到查询分区。
在对分区表做 drop,truncate,split,merge,exchange 都会造成本地索引或全局索引的失效,操作完了,记得要重建索引
当然在生产库上 得加上update indexes 可以维护本地索引和全局索引,update global indexes 只维护全局索引。其中exchange 比较特别,即便加上update indexes 索引仍旧失效,千万别忘了重建索引。
截断分区
ALTER TABLE tablename TRUNCATE PARTITION pname [DROP STORAGE | REUSE STORAGE] UPDATE INDEXES;
删除分区
ALTER TABLE tablename DROP PARTITION pname UPDATE GLOBAL INDEXES;
分裂分区
ALTER TABLE tablename SPLIT PARTITION pname1 AT (split point) INTO (PARTITION pname2, PARTITION pname3);
重建全局索引
ALTER INDEX tablename REBUILD [ ONLINE ] [ PARALLEL value ] [ NOLOGGING ] ;
重建分区索引
ALTER INDEX tablename REBUILD PARTITION pname [ ONLINE ] [ PARALLEL value ] [ NOLOGGING ] ;
线上重建索引大表一定要online ,以免DML阻塞