DB2索引創(chuàng)建原則
DB2索引創(chuàng)建都應(yīng)該哪些原則呢?這是很多人都提到的問(wèn)題,下面就為您詳細(xì)介紹DB2索引創(chuàng)建原則,供您參考學(xué)習(xí)。
DB2索引實(shí)現(xiàn)是一個(gè)B+樹(shù),通過(guò)索引可以實(shí)現(xiàn)快速查詢,避免全表掃描以此來(lái)減少IO操作。
索引是對(duì)表數(shù)據(jù)的一種抽象,通過(guò)抽取有限數(shù)據(jù),對(duì)數(shù)據(jù)的分布進(jìn)行計(jì)算,以此來(lái)完成對(duì)數(shù)據(jù)的快速檢索。
索引創(chuàng)建語(yǔ)句
- CREATE INDEX <INDEX_NAME> ON <TABLE_NAME> (<COLNAME1,COLNAME2…>)
創(chuàng)建索引需要注意的地方:
索引應(yīng)該用來(lái)提高查詢速度,但是會(huì)對(duì)更新和刪除操作帶來(lái)負(fù)面影響,因?yàn)橐礁滤饕?。所以索引?yīng)該創(chuàng)建到更新、刪除相對(duì)比讀取少的表上。
索引需要獨(dú)立的空間進(jìn)行存儲(chǔ)和管理。索引是需要磁盤空間來(lái)存儲(chǔ)。所以避免重復(fù)創(chuàng)建冗余索引。如下:
- “CREATE TABLE TEST_IDX (COL1 INT NOT NULL, COL2 INT NOT NULL, COL3 IN NOT NULL)”“CREATE INDEX TEST_IDX_IDX1 ON TEST_IDX (COL1, COL2, COL3)”
已經(jīng)有索引TEST_IDX_IDX1在三個(gè)列上,在創(chuàng)建”CREATE INDEX TEST_IDX_IDX2 ON TEST_IDX (COL1, COL2)”,這樣的索引一般沒(méi)有什么作用。
索引用來(lái)避免表掃描。通過(guò)索引對(duì)大量數(shù)據(jù)抽取有限部分,形成一個(gè)相對(duì)少量的有序數(shù)據(jù)結(jié)構(gòu),通過(guò)對(duì)有序數(shù)據(jù)結(jié)構(gòu)的查找可以快速想要查找的數(shù)據(jù)。所以索引適合建立在數(shù)據(jù)量比較大的表上,而且該表上的查詢經(jīng)常是根據(jù)條件查詢部分?jǐn)?shù)據(jù)。比如一些系統(tǒng)基礎(chǔ)表,如SYSTEM表,這些表數(shù)據(jù)量小,而且經(jīng)常是查詢?nèi)繑?shù)據(jù),所以這些表上建立索引對(duì)性能的影響不是很大,完全可以避免,以免對(duì)管理造成影響。
創(chuàng)建索引的目的還有一個(gè)就是保證數(shù)據(jù)唯一性,可以利用”CREATE UNIQUE INDEX <INDEX_NAME> ON <TABLENAME> (<COLNAME>)”,來(lái)完成。
主鍵會(huì)隱式創(chuàng)建索引,所以請(qǐng)不要在主鍵上創(chuàng)建索引浪費(fèi)空間。
盡量減少索引的創(chuàng)建。DB2路徑訪問(wèn)優(yōu)化器會(huì)根據(jù)表中所提供的索引來(lái)完成盡可能多的訪問(wèn)路徑的成本估計(jì)。創(chuàng)建過(guò)多的索引意味著DB2優(yōu)化器生成更多的訪問(wèn)路徑,完成更多的訪問(wèn)計(jì)劃成本估算,這會(huì)增加SQL語(yǔ)句編譯時(shí)間。
創(chuàng)建唯一索引可以避免排序。因?yàn)樗饕怯行驍?shù)據(jù)結(jié)構(gòu),在進(jìn)行掃描時(shí),DB2會(huì)默認(rèn)按照順序輸出結(jié)果,而不是按照插入先后。通過(guò)創(chuàng)建唯一索引可以避免排序,提高查詢性能。
具有大量重復(fù)數(shù)據(jù)的列上不要?jiǎng)?chuàng)建索引。在大量重復(fù)的列上創(chuàng)建索引沒(méi)有任何意義。如下數(shù)據(jù)結(jié)構(gòu):表中字段col1有大量重復(fù)數(shù)據(jù),其中的數(shù)據(jù)分布是按照90%的Y,和10%的N來(lái)分布。這樣的列上創(chuàng)建索引沒(méi)有任何意義。在查詢條件為col1=‘Y’時(shí),該表的索引掃描和表掃描沒(méi)有特大差異。根據(jù)實(shí)踐經(jīng)驗(yàn),列上的數(shù)據(jù)分布應(yīng)該均勻,并且抽密度不能大于5 ‰。
創(chuàng)建如下表:
- “CREATE TABLE TEST1 (NO INT NOT NULL, NAME CHAR(5))”
- “CREATE INDEX TEST1_IDX_1 ON TEST1 (NO)”
- “INSERT INTO TEST1 SELECT ROW_NUMBER() OVER(), CHR(INT(RAND()*75+48))||CHR(INT(RAND()*75+48))||CHR(INT(RAND()*75+48)) FROM SYSCAT.COLUMNS T1 JOIN SYSCAT.COLUMNS T2 ON T1.COLNAME!=T2.COLNAME FETCH FIRST 100 ROWS ONLY“
- “SELECT * FROM TEST1 WHERE NO = 50”
以上就是DB2索引創(chuàng)建原則介紹。
【編輯推薦】
DB2分區(qū)數(shù)據(jù)庫(kù)的前滾操作
DB2分區(qū)數(shù)據(jù)庫(kù)備份的實(shí)現(xiàn)方法
DB2批量執(zhí)行SQL腳本的實(shí)現(xiàn)