1. 一個(gè)表如果建有大量索引會(huì)影響 INSERT、UPDATE 和 DELETE 語句的性能,因?yàn)樵诒碇械臄?shù)據(jù)更改時(shí),所有索引都須進(jìn)行適當(dāng)?shù)恼{(diào)整。另一方面,對(duì)于不需要修改數(shù)據(jù)的查詢(SELECT 語句),大量索引有助于提高性能,因?yàn)閿?shù)據(jù)庫有更多的索引可供選擇,以便確定以最快速度訪問數(shù)據(jù)的最佳方法。
2. 組合索引:組合索引即多列索引,指一個(gè)索引含有多個(gè)列。一個(gè)組合索引相當(dāng)于多個(gè)單列索引,如索引(ColA, ColB, ColC)至少相當(dāng)于(ColA)、(ColA, ColB)、(ColA, ColB, ColC)三個(gè)索引。
2. 覆蓋的查詢可以提高性能。覆蓋的查詢是指查詢中所有指定的列都包含在同一個(gè)索引(組合索引)中。例如,如果在一個(gè)表的 a、b 和 c 列上創(chuàng)建了組合索引,則從該表中檢索 a 和 b 列的查詢被視為覆蓋的查詢。創(chuàng)建覆蓋一個(gè)查詢的索引可以提高性能,因?yàn)樵摬樵兊乃袛?shù)據(jù)都包含在索引自身當(dāng)中;檢索數(shù)據(jù)時(shí)只需引用表的索引頁,不必引用數(shù)據(jù)頁,因而減少了 I/O 總量。盡管給索引添加列以覆蓋查詢可以提高性能,但在索引中額外維護(hù)更多的列會(huì)產(chǎn)生更新和存儲(chǔ)成本。
3. 對(duì)小型表進(jìn)行索引可能不會(huì)產(chǎn)生優(yōu)化效果,因?yàn)閿?shù)據(jù)庫在遍歷索引以搜索數(shù)據(jù)時(shí),花費(fèi)的時(shí)間可能會(huì)比簡單的表掃描還長。
4. 應(yīng)使用 SQL 事件探查器和索引優(yōu)化向?qū)椭治霾樵?,確定要?jiǎng)?chuàng)建的索引。為數(shù)據(jù)庫及其工作負(fù)荷選擇正確的索引是非常復(fù)雜的,需要在查詢速度和更新成本之間取得平衡。窄索引(搜索關(guān)鍵字中只有很少的列的索引)需要的磁盤空間和維護(hù)開銷都更少。而另一方面,寬索引可以覆蓋更多的查詢。確定正確的索引集沒有簡便的規(guī)則。經(jīng)驗(yàn)豐富的數(shù)據(jù)庫管理員常常能夠設(shè)計(jì)出很好的索引集,但是,即使對(duì)于不特別復(fù)雜的數(shù)據(jù)庫和工作負(fù)荷來說,這項(xiàng)任務(wù)也十分復(fù)雜、費(fèi)時(shí)和易于出錯(cuò)。可以使用索引優(yōu)化向?qū)惯@項(xiàng)任務(wù)自動(dòng)化。有關(guān)更多信息,請(qǐng)參見索引優(yōu)化向?qū)А?/p>
5. 可以在視圖上指定索引。
6. 可以在計(jì)算列上指定索引。
7. 避免在索引列上使用IS NULL和IS NOT NULL。避免在索引中使用任何可以為空的列,數(shù)據(jù)庫將無法使用該索引。對(duì)于單列索引,如果列包含空值,索引中將不存在此記錄;對(duì)于復(fù)合索引,如果每個(gè)列都為空,索引中同樣不存在此記錄. 如果至少有一個(gè)列不為空,則記錄存在于索引中。
8. 如果經(jīng)常檢索包含大量數(shù)據(jù)的表中的少于15%的行則需要?jiǎng)?chuàng)建索引。
9. 衡量索引效率的 95/5 規(guī)則:如果查詢的結(jié)果返回的行數(shù)少于表中所有行的5%,則索引是檢索數(shù)據(jù)的最快方法,如果查詢的結(jié)果超過5%,那么通常使用索引就不是最快的方式。
10.主關(guān)鍵字和唯一關(guān)鍵字所在的列自動(dòng)具有索引,但外部關(guān)鍵字沒有自動(dòng)索引。
二、索引的特征 ??? 在確定某一索引適合某一查詢之后,可以自定義最適合具體情況的索引類型。索引特征包括:
●聚集還是非聚集 ●唯一還是不唯一 ●單列還是多列 ●索引中的列順序?yàn)樯蜻€是降序(索引缺省為升序,但目前多數(shù)大型數(shù)據(jù)庫已經(jīng)能夠支持反向索引) ●覆蓋還是非覆蓋 ●還可以自定義索引的初始存儲(chǔ)特征,通過設(shè)置填充因子優(yōu)化其維護(hù),并使用文件和文件組自定義其位置以優(yōu)化性能。 ●位映射索引(bitmap)
|