分享更有价值
被信任是一种快乐

Partition table分区表删除分区数据时导致索引失效怎么办

文章页正文上

小编给大家分享一下Partition table分区表删除分区数据时导致索引失效怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、描述 有个小任务就是要删除些数据,哈哈,先自己小开心一下。因为要删除的数据表是我之前转换成的分区表。这个分区表是按照里面有个创建时间字段来分区的,1个季度为1个分区。所以我现在要将2017年7月1日之前的数据删除(数据量约1000万),可以直接删除表分区数据就好。如果要是用delete去删除这么多的数据,我还要写存储过程,分批提交的这样做。就是这样的一简单的truncate partition 引发了后继的业务故障。最终查询到该表的索引失效,重建立后恢复。真是汗!二、实验1.创建环境

SQL> create table TEST_PARTAS (id number(11), ACCOUNT_ID number(11) ,CTIME date)
2 partition by range (CTIME)
3 interval( NUMTOYMINTERVAL(3,’month’))
4 (partition P0 values less than (TO_DATE(‘2016-01-01′,’yyyy-mm-dd’)),
5 partition p1 values less than (to_date(‘2017-01-01′,’yyyy-mm-dd’)));

Table created.

SQL> insert into TEST_PARTAS select t.id,t.account_id,t.create_time from act_test t;
3483178 rows created.

SQL> commit;
Commit complete.

SQL> EXEC SYS.DBMS_STATS.GATHER_TABLE_STATS(‘SAM’,’TEST_PARTAS’);
PL/SQL procedure successfully completed.2.检查分区表及数据

SQL> select count(*) from TEST_PARTAS;

COUNT(*)
———-
3483178

SQL> set lines 120 pages 200;
SQL> set long 9999999
SQL> col table_name for a15
SQL> col PARTITION_NAME for a10

SQL> select t.table_name,t.partition_name,t.num_rows,t.blocks,t.interval,t.high_value from USER_TAB_PARTITIONS t;

TABLE_NAME PARTITION_ NUM_ROWS BLOCKS INT HIGH_VALUE
————— ———- ———- ———- — ————————————————–
TEST_PARTAS P0 2182116 6046 NO TO_DATE(‘ 2016-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:
MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)

TEST_PARTAS P1 616290 36506 NO TO_DATE(‘ 2017-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:
MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)

TEST_PARTAS SYS_P1611 44829 4030 YES TO_DATE(‘ 2017-04-01 00:00:00’, ‘SYYYY-MM-DD HH24:
MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)

TEST_PARTAS SYS_P1612 21706 3022 YES TO_DATE(‘ 2017-07-01 00:00:00’, ‘SYYYY-MM-DD HH24:
MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)

TEST_PARTAS SYS_P1613 172525 3022 YES TO_DATE(‘ 2017-10-01 00:00:00’, ‘SYYYY-MM-DD HH24:
MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)

TEST_PARTAS SYS_P1614 442435 2014 YES TO_DATE(‘ 2018-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:
MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)

TEST_PARTAS SYS_P1615 3277 238 YES TO_DATE(‘ 2018-04-01 00:00:00’, ‘SYYYY-MM-DD HH24:
MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)

7 rows selected.
3.创建主键和索引

SQL> alter table TEST_PARTAS add constraint pk_id primary key(ID);
Table altered.

SQL> CREATE INDEX IND_ACCOUNT_ID ON TEST_PARTAS (ACCOUNT_ID);
Index created.
4.检查索引状态,当前状态可用

SQL> select T.INDEX_NAME,T.TABLE_NAME,T.STATUS from user_indexes t where t.table_免费主机域名name=’TEST_PARTAS’;

INDEX_NAME TABLE_NAME STATUS
—————————— —————————— ——–
PK_ID TEST_PARTAS VALID
IND_ACCOUNT_ID TEST_PARTAS VALID
5.用truncate 删除p0分区数据,不加update index参数

SQL> alter table test_partas truncate partition p0;

Table truncated.
6.检查索引状态,状态不可用

SQL> select T.INDEX_NAME,T.TABLE_NAME,T.STATUS from user_indexes t where t.table_name=’TEST_PARTAS’;

INDEX_NAME TABLE_NAME STATUS
—————————— —————————— ——–
PK_ID TEST_PARTAS UNUSABLE
IND_ACCOUNT_ID TEST_PARTAS UNUSABLE
7.重建立索引,要加online ,尽量减小对业务的冲击

SQL> alter index PK_ID rebuild online;

Index altered.

SQL> alter index IND_ACCOUNT_ID rebuild online;

Index altered.
8.检查索引状态,此时索引恢复正常可用状态

SQL> select T.INDEX_NAME,T.TABLE_NAME,T.STATUS from user_indexes t where t.table_name=’TEST_PARTAS’;

INDEX_NAME TABLE_NAME 免费主机域名 STATUS
—————————— —————————— ——–
PK_ID TEST_PARTAS VALID
IND_ACCOUNT_ID TEST_PARTAS VALID
9.用truncate 删除p1分区数据,增加update index参数

SQL> alter table test_partas truncate partition p1 update indexes;

Table truncated.10.检查索引状态,此时索引正常可用状态

SQL> select T.INDEX_NAME,T.TABLE_NAME,T.STATUS from user_indexes t where t.table_name=’TEST_PARTAS’;

INDEX_NAME TABLE_NAME STATUS
—————————— —————————— ——–
PK_ID TEST_PARTAS VALID
IND_ACCOUNT_ID TEST_PARTAS VALID三、扩展 通过这个问题,我们再扩展一下,如果drop分区会不会同样影响索引,答案是肯定的,删除分区,索引仍然失效。

SQL> alter table test_partas drop partition SYS_P1611;

Table altered.

SQL> select T.INDEX_NAME,T.TABLE_NAME,T.STATUS from user_indexes t where t.table_name=’TEST_PARTAS’;

INDEX_NAME TABLE_NAME STATUS
—————————— —————————— ——–
PK_ID TEST_PARTAS UNUSABLE
IND_ACCOUNT_ID TEST_PARTAS UNUSABLE以上是“Partition table分区表删除分区数据时导致索引失效怎么办”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注云技术行业资讯频道!

相关推荐: Oracle Linux 6.7中 Oracle 11.2.0.4 RAC集群CRS异常处理方法是什么

这篇文章主要讲解了“Oracle Linux 6.7中 Oracle 11.2.0.4 RAC集群CRS异常处理方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle Linux 6.7中 Ora…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册