oracle分區(qū)表目前已經(jīng)很普遍的應(yīng)用于我們的生產(chǎn)系統(tǒng),但是在日常需要維護分區(qū)表的時候,一些對于分區(qū)表的基本操作的時候,我們難免會對分區(qū)表上的索引是否失效有些擔(dān)心,那么今天我就帶大家看下具體哪些操作會導(dǎo)致分區(qū)表上的索引失效。
鄒城ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
為了控制篇幅,本次實驗只針對RANGE分區(qū),其他兩種分區(qū)請有興趣的同學(xué)自行測試哦~~~
熟悉分區(qū)表的人都應(yīng)該知道,oracle分區(qū)表的索引類型分為兩種,一種是Local索引又稱本地索引,一種是Global索引也叫全局索引。本次實驗不具體介紹這兩種索引對分區(qū)表訪問所產(chǎn)生的性能問題方面的差異,只介紹一些常用的DDL操作對分區(qū)表上的索引的一些影響。
如果想要知道兩種索引的性能差異,請期待下期的文章分享哦~~~~
createtable tmp_test_range
(
idnumber,
id_localnumber,
namevarchar2(30),
int_datedate,
bzvarchar2(20)
)
PARTITIONBYRANGE(int_date)
--interval(numtodsinterval (1,'DAY'))
(
partition P201511valueslessthan(to_date('20151201','yyyymmdd')),
partition P20151201valueslessthan(to_date('20151202','yyyymmdd')),
partition P20151203valueslessthan(to_date('20151203','yyyymmdd')),
partition P20151204valueslessthan(to_date('20151204','yyyymmdd')),
partition P20151205valueslessthan(to_date('20151205','yyyymmdd')),
partition P20151206valueslessthan(to_date('20151206','yyyymmdd')),
partition P20151207valueslessthan(to_date('20151207','yyyymmdd'))
);
向分區(qū)表中插入數(shù)據(jù):
declare
v_datedate:= to_date('20151127','yyyy-mm-dd');
begin
for cin1 ..9loop
for din1 ..100loop
insertinto tmp_test_rangevalues(c|| d,c||d,'測試數(shù)據(jù)', v_date,'BZ');
endloop;
v_date:= v_date+1;
endloop;
commit;
end;
創(chuàng)建索引:
分別在ID,ID_LOCAL和創(chuàng)建一個全局索引和分區(qū)索引
createindex I_TMP_TEST_RANGE_Gon tmp_test_range(id)nologging;
createindex I_TMP_TEST_RANGE_Lon tmp_test_range(id_local)nologgingLOCAL;
查看索引的狀態(tài):
local索引:
Global索引:
2.2 DDL操作對全局索引的影響:好了,前面的基礎(chǔ)工作已經(jīng)準備完畢,下面我們開始做一些DDL操作,看下對全局索引的影響。
添加分區(qū)和對其中一個分區(qū)重命名:
ALTERTABLE tmp_test_rangeADDPARTITION P20151208valueslessthan(to_date('20151208','yyyymmdd'));
ALTERTABLE tmp_test_rangeRENAMEPARTITION P20151207TO P20151207_2;
查看索引情況:
Global
Local索引:
總結(jié):添加分區(qū)和對分區(qū)重新命名并不會導(dǎo)致Global和local索引失效。
刪除表中的分區(qū):
ALTERTABLE tmp_test_rangeDROPPARTITION P20151208;
清空其中一個分區(qū)中的數(shù)據(jù):
ALTERTABLE tmp_test_rangeTRUNCATEPARTITION P201511;
查看索引情況:
local索引會將被刪除的分區(qū)上的local索引刪除,不會影響到其他分區(qū)的索引。
Global索引:
OK,經(jīng)過上面的實驗可能你很容易就能得出結(jié)論說,刪除分區(qū)不會導(dǎo)致Global索引失效,其實不然,讓我們看一種其他情況:
查看某個分區(qū)的數(shù)據(jù)(P201511),看下圖是存在數(shù)據(jù)的:
現(xiàn)在對分區(qū)進行刪除:
altertable tmp_test_rangedroppartition P201511;
或者:
ALTERTABLE tmp_test_rangeTRUNCATEPARTITION P201518;
查看Global索引:
唉,還是失效了,所以在刪除分區(qū)表中的分區(qū)的時候,一定要確認有沒有數(shù)據(jù)存在。
總結(jié):
刪除分區(qū)表中的分區(qū)的時候 或者truncate 分區(qū)中的數(shù)據(jù)時,一定要確認分區(qū)中是否有數(shù)據(jù)存在,如果沒有數(shù)據(jù)不會導(dǎo)致Global失效,反之則會導(dǎo)致Global索引失效。而對其他分區(qū)上的local索引都不會造成影響。
合并分區(qū):
合并分區(qū)有兩種方式,一種是維護索引的,一種是不維護索引。我們先來看不維護索引的。
ALTERTABLE tmp_test_rangeMERGEPARTITIONS P201511,P20151201INTOPARTITION P20151208;
查看索引的情況:
總結(jié):Global索引,做合并分區(qū)操作的時候會導(dǎo)致Global索引失效,所以操作的時候一定要當心哦?。。?/p>
local索引不會維護合并后的分區(qū),但是不會影響其他的分區(qū),合并分區(qū)操作還會將原來被合并的分區(qū)刪除。
當然oracle也提供了合并分區(qū)的時候維護索引的操作,當大家在線上操作的時候,請使用下面的語句對分區(qū)做合并。
ALTERTABLE tmp_test_rangeMERGEPARTITIONS P201511,P20151201INTOPARTITION P20151208update indexes ;
這樣就不會在做合并分區(qū)操作的時候,導(dǎo)致索引失效了。
拆分分區(qū):
拆分分區(qū)同樣也是有兩種方式,一種是直接拆分并不維護索引,另一種是帶維護索引的拆分方式。具體操作見下面的實驗:
我們先看維護索引的方式拆分:
ALTERTABLE tmp_test_rangeSPLITPARTITION P201511at(date'2015-11-28') INTO(PARTITION TAB_PARTOTION_05,PARTITION TAB_PARTOTION_OTHERE)updateindexes;
查看索引的情況:
果然使用update indexes的方式進行拆分Global索引和local索引都是正常的。那下面我們再來看下不維護索引的方式:
ALTERTABLE tmp_test_rangeSPLITPARTITION P201511at(date'2015-11-28')
INTO(PARTITION TAB_PARTOTION_05,PARTITION TAB_PARTOTION_OTHERE);
還是沒有令我們失望,使用這種直接拆分的方式兩種索引都有失效的情況發(fā)生,
local索引在新增的兩個分區(qū)上的索引失效,Global索引還是不負眾望的失效了。
總結(jié):
對分區(qū)表進行拆分分區(qū)的時候如果不加參數(shù) update indexes會導(dǎo)致新增分區(qū)上的local索引失效,Global索引失效。采用update indexes的方式這兩種索引都不會失效。
交換分區(qū):
交換分區(qū)同樣也是有兩種方式,一種是自動維護索引的,一種是直接交換分區(qū)不做維護索引操作,顯然第二種方式會導(dǎo)致索引失效。具體見下面的實驗(下面兩個不要同時操作):
ALTERTABLE tmp_test_rangeEXCHANGEPARTITION P201511WITHTABLE tmp_test_range_2;
ALTERTABLE tmp_test_rangeEXCHANGEPARTITION P201511 WITHTABLE tmp_test_range_2updateINDEXES;
查看兩個索引情況:
果不其然,交換分區(qū)還是會導(dǎo)致Global索引失效,local索引還是被交換的分區(qū)上的索引失效。所以在做交換分區(qū)的時候,我們還是可以使用update indexes來維護索引Global索引,但是對于local索引即使使用update indexes也會導(dǎo)致local索引失效,還是要再重新維護。
3、總結(jié):好了,上面我們說了那么多,讓我們總結(jié)一下,具體哪些操作會對分區(qū)表上的索引有一定的影響。
兩種索引都不會產(chǎn)生影響的操作:
1.添加分區(qū)
2.刪除分區(qū)(分區(qū)中沒有數(shù)據(jù))
3.對分區(qū)重命名
會產(chǎn)生影響的:
1.合并分區(qū)
新增分區(qū)上的local索引失效
Global索引失效
PS:使用update indexes的方式可以避免索引失效的發(fā)生(包括local索引和Global索引)。
2、拆分分區(qū)
拆分出來的分區(qū)上的local索引失效
Global索引失效
PS:使用update indexes的方式可以避免索引失效的發(fā)生(包括local索引和Global索引)。
3、分區(qū)交換
被交換分區(qū)上的local索引失效
Global索引失效
PS:使用update indexes的方式可以避免Global索引失效的發(fā)生,不能避免local索引失效。
4、刪除分區(qū) 或者truncate分區(qū)中的數(shù)據(jù) 時,如果被刪除的分區(qū)上有數(shù)據(jù)存在,會導(dǎo)致Global索引失效。
通過上面的實驗我們可以看出對于分區(qū)表來說,且不論性能如何,就單單對方便數(shù)據(jù)管理來說,還是創(chuàng)建local索引更加方便對分區(qū)表中數(shù)據(jù)的管理。
author:馮棟華