個人理解。
看了好幾天,終於差不多弄明白了。
分區表不能在現有表上面改,必須重建。可以RENAME OLD_TABLE,然後CREATE相同表名的分區表,COPY數據。
下面就開始建索引,這一步有點難度。而且必須謹慎。
對分區表可以分爲四種索引,全局不分區、全局分區、局部有前綴、局部無前綴。
決定使用哪種索引,要先分析所有相關的SQL,找出使用最頻繁的那幾條查詢語句。針對這些SQL,開始設計索引。
全局不分區索引:CREATE INDEX IND1 ON TB_NAME(COL_A) GLOBAL;這種跟最一般的索引可能分別不大或者就是一樣。不提。
全局分區索引:
TABLE表有四個列COL_A COL_B COL_C COL_D,COL_A爲分區列。
如果SQL如FROM TABLE WHERE COL_B=#B;使用很頻繁,這句查詢語句是進入不到分區的,那就考慮在COL_B上建全局分區索引。相對於全部不分區索引效率高。
局部有前綴索引:
如果SQL如FROM TABLE WHERE COL_A=#A AND COL_B=#B AND COL_C=#C;使用非常頻繁,可以考慮建局部有前綴索引,CREATE INDEX IND1 ON TABLE(COL_A,COL_B,COL_C) LOCAL;
這是複合索引,參考http://blog.chinaunix.net/uid-25557346-id-3243552.html
局部無前綴索引:
如果SQL如FROM TABLE WHERE COL_A=#A AND COL_B=#B;和FROM TABLE WHERE COL_A=#A AND COL_C=#C和FROM TABLE WHERE COL_A=#A AND COL_D=#D三種全部都使用頻繁,可以考慮在三個列上建無前綴索引,ON TABLE(COL_B) LOCAL; ON TABLE(COL_C) LOCAL; ON TABLE(COL_D) LOCAL;
當然如果改成三個有前綴索引,如ON TABLE(COL_A,COL_B) LOCAL;查詢效率會更高。但是索引維護開銷可能很大。
關於全局分區索引,應該叫建索引分區,跟表分區類似,指定一個分區列,跟那個表分區的分區列是兩碼事,然後指定列值的範圍,把這個列的全部索引樹分成幾部分,也就是索引分區。下次查詢的時候,就不用遍歷整個索引樹了。
------------------------------------------------------------------------------------------
LOCAL只有在分區表可以用。否則會報錯的。ORA-14...GLOBAL都可以用。
關於LOCAL本地索引:
如上,如果分區列爲COL_A,查詢條件包括COL_A時可以進入分區,否則仍然會全表掃描。
如果在COL_B建一個LOCAL無前綴索引,查詢條件如WHERE T.COL_B=...不包含COL_A時仍然全表掃描。
如果WHERE T.COL_A=#A AND COL_B=#B,會先進入分區,在訪問COL_B索引,這種情況
如果索引改爲前綴索引CREATE INDEX INDEX_NAME ON TABLE_NAME(COL_A,COL_B) LOCAL;效率會更高。
有前綴和無前綴體現在這裏。
如果建立本地索引的時候,要建立的字段已經建立的全局索引,那建立這個索引的時候也要報錯,反之亦然:(全局分區不分區索引都會)
全局分區索引可以建在分區列和其他列上,沒有關係。
全局分區索引必須是前綴索引,指的是以全局分區索引使用的分區列爲前綴,而不是TABLE表的分區列。
可以建全局不分區索引。對此沒有前綴非前綴之分。
只有聯合索引纔有前綴無前綴的區別。
用分區列作聯合索引的第一項就是前綴索引,否則是非前綴索引。
前綴與非前綴的區別不在於效率,
而在於查詢條件中選擇性最好的字段是否是索引的前導列.
全局索引也爲全局非分區索引與全局分區索引,
全局非分區索引在進行跨分區掃描時很有優勢,
本地索引在單個分區內掃描時很有優勢.
參考
http://blog.chinaunix.net/uid-25557346-id-3243552.html
http://www.examw.com/oracle/jishu/187007/
http://www.itpub.net/thread-429282-3-1.html
http://blog.csdn.net/robinson1988/article/details/5276924
http://zhidao.baidu.com/question/424294866.html