Partitiontable分區(qū)表刪除分區(qū)數(shù)據(jù)時(shí)導(dǎo)致索引失效怎么辦

小編給大家分享一下Partition table分區(qū)表刪除分區(qū)數(shù)據(jù)時(shí)導(dǎo)致索引失效怎么辦,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的10多年時(shí)間我們累計(jì)服務(wù)了上千家以及全國政企客戶,如成都iso認(rèn)證等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過硬的技術(shù)實(shí)力獲得客戶的一致贊揚(yáng)。

一、描述

       有個(gè)小任務(wù)就是要?jiǎng)h除些數(shù)據(jù),哈哈,先自己小開心一下。因?yàn)橐獎(jiǎng)h除的數(shù)據(jù)表是我之前轉(zhuǎn)換成的分區(qū)表。這個(gè)分區(qū)表是按照里面有個(gè)創(chuàng)建時(shí)間字段來分區(qū)的,1個(gè)季度為1個(gè)分區(qū)。所以我現(xiàn)在要將2017年7月1日之前的數(shù)據(jù)刪除(數(shù)據(jù)量約1000萬),可以直接刪除表分區(qū)數(shù)據(jù)就好。如果要是用delete去刪除這么多的數(shù)據(jù),我還要寫存儲(chǔ)過程,分批提交的這樣做。就是這樣的一簡單的truncate partition 引發(fā)了后繼的業(yè)務(wù)故障。最終查詢到該表的索引失效,重建立后恢復(fù)。真是汗!

二、實(shí)驗(yàn)

1.創(chuàng)建環(huán)境

  1. SQL> create table TEST_PARTAS (id number(11), ACCOUNT_ID number(11) ,CTIME date)

  2.   2  partition by range (CTIME)

  3.   3  interval( NUMTOYMINTERVAL(3,'month'))

  4.   4 (partition P0 values less than (TO_DATE('2016-01-01','yyyy-mm-dd')),

  5.   5   partition p1 values less than (to_date('2017-01-01','yyyy-mm-dd')));

  6. Table created.

  7. SQL> insert into TEST_PARTAS select t.id,t.account_id,t.create_time from act_test t;

  8. 3483178 rows created.

  9. SQL> commit;

  10. Commit complete.

  11. SQL> EXEC SYS.DBMS_STATS.GATHER_TABLE_STATS('SAM','TEST_PARTAS');

  12. PL/SQL procedure successfully completed.

2.檢查分區(qū)表及數(shù)據(jù)

  1. SQL> select count(*) from TEST_PARTAS;

  2.   COUNT(*)

  3. ----------

  4.    3483178

  5. SQL> set lines 120 pages 200;

  6. SQL> set long 9999999

  7. SQL> col table_name for a15

  8. SQL> col PARTITION_NAME for a10

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

  10. TABLE_NAME      PARTITION_   NUM_ROWS     BLOCKS INT HIGH_VALUE

  11. --------------- ---------- ---------- ---------- --- --------------------------------------------------

  12. TEST_PARTAS     P0            2182116       6046 NO TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:

  13.                                                      MI:SS', 'NLS_CALENDAR=GREGORIAN')

  14. TEST_PARTAS     P1             616290      36506 NO TO_DATE(' 2017-01-01 00:00:00', 'SYYYY-MM-DD HH24:

  15.                                                      MI:SS', 'NLS_CALENDAR=GREGORIAN')

  16. TEST_PARTAS     SYS_P1611       44829       4030 YES TO_DATE(' 2017-04-01 00:00:00', 'SYYYY-MM-DD HH24:

  17.                                                      MI:SS', 'NLS_CALENDAR=GREGORIAN')

  18. TEST_PARTAS     SYS_P1612       21706       3022 YES TO_DATE(' 2017-07-01 00:00:00', 'SYYYY-MM-DD HH24:

  19.                                                      MI:SS', 'NLS_CALENDAR=GREGORIAN')

  20. TEST_PARTAS     SYS_P1613      172525       3022 YES TO_DATE(' 2017-10-01 00:00:00', 'SYYYY-MM-DD HH24:

  21.                                                      MI:SS', 'NLS_CALENDAR=GREGORIAN')

  22. TEST_PARTAS     SYS_P1614      442435       2014 YES TO_DATE(' 2018-01-01 00:00:00', 'SYYYY-MM-DD HH24:

  23.                                                      MI:SS', 'NLS_CALENDAR=GREGORIAN')

  24. TEST_PARTAS     SYS_P1615        3277        238 YES TO_DATE(' 2018-04-01 00:00:00', 'SYYYY-MM-DD HH24:

  25.                                                      MI:SS', 'NLS_CALENDAR=GREGORIAN')

  26. 7 rows selected.


3.創(chuàng)建主鍵和索引

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

  2. Table altered.

  3. SQL> CREATE INDEX IND_ACCOUNT_ID ON TEST_PARTAS (ACCOUNT_ID);

  4. Index created.


4.檢查索引狀態(tài),當(dāng)前狀態(tài)可用

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

  2. INDEX_NAME                     TABLE_NAME                     STATUS

  3. ------------------------------ ------------------------------ --------

  4. PK_ID                          TEST_PARTAS VALID

  5. IND_ACCOUNT_ID                 TEST_PARTAS VALID


5.用truncate 刪除p0分區(qū)數(shù)據(jù),不加update index參數(shù)

  1. SQL> alter table test_partas truncate partition p0;

  2. Table truncated.


6.檢查索引狀態(tài),狀態(tài)不可用 

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

  2. INDEX_NAME                     TABLE_NAME                     STATUS

  3. ------------------------------ ------------------------------ --------

  4. PK_ID                          TEST_PARTAS UNUSABLE

  5. IND_ACCOUNT_ID                 TEST_PARTAS UNUSABLE


7.重建立索引,要加online ,盡量減小對業(yè)務(wù)的沖擊

  1. SQL> alter index PK_ID rebuild online;

  2. Index altered.

  3. SQL> alter index IND_ACCOUNT_ID rebuild online;

  4. Index altered.


8.檢查索引狀態(tài),此時(shí)索引恢復(fù)正??捎脿顟B(tài)

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

  2. INDEX_NAME                     TABLE_NAME                     STATUS

  3. ------------------------------ ------------------------------ --------

  4. PK_ID                          TEST_PARTAS VALID

  5. IND_ACCOUNT_ID                 TEST_PARTAS VALID


9.用truncate 刪除p1分區(qū)數(shù)據(jù),增加update index參數(shù)

  1. SQL> alter table test_partas truncate partition p1 update indexes;

  2. Table truncated.

10.檢查索引狀態(tài),此時(shí)索引正??捎脿顟B(tài)

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

  2. INDEX_NAME                     TABLE_NAME                     STATUS

  3. ------------------------------ ------------------------------ --------

  4. PK_ID                          TEST_PARTAS VALID

  5. IND_ACCOUNT_ID                 TEST_PARTAS VALID

三、擴(kuò)展

       通過這個(gè)問題,我們再擴(kuò)展一下,如果drop分區(qū)會(huì)不會(huì)同樣影響索引,答案是肯定的,刪除分區(qū),索引仍然失效。

  1. SQL> alter table test_partas drop partition SYS_P1611;

  2. Table altered.

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

  4. INDEX_NAME                     TABLE_NAME                     STATUS

  5. ------------------------------ ------------------------------ --------

  6. PK_ID                          TEST_PARTAS UNUSABLE

  7. IND_ACCOUNT_ID                 TEST_PARTAS UNUSABLE

以上是“Partition table分區(qū)表刪除分區(qū)數(shù)據(jù)時(shí)導(dǎo)致索引失效怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

新聞標(biāo)題:Partitiontable分區(qū)表刪除分區(qū)數(shù)據(jù)時(shí)導(dǎo)致索引失效怎么辦
網(wǎng)頁URL:http://bm7419.com/article22/jdjcjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、虛擬主機(jī)、網(wǎng)站建設(shè)、企業(yè)建站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司