Sql Server系列:索引設計原則及優化

libingql發表於2014-11-25

1. 索引設計原則

  索引設計不合理或缺少索引都會對資料庫的效能造成障礙,高效的索引對於獲得良好的效能非常重要。

  設計索引時的一些原則:

  ◊ 索引並不是越多越好,一個表中如果有大量的索引,不僅佔用大量的磁碟空間,而且會影響INSERT、DELETE、UPDATE等語句的效能。當表中資料更改的同時,索引也會進行調整和更新。

  ◊ 避免對經常更新的表進行過多的索引,並且索引中的列儘可能少。而對經常用於查詢的欄位應該建立索引,但要避免新增不必要的欄位。

  ◊ 資料量小的表最好不要使用索引,由於資料較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。

  ◊ 在條件表示式中經常用到的、不同值較多的列上建立索引,在不同值較少的列上不要建立索引。比如欄位【性別】上只有【男】【女】兩個不同值,因此無須建立索引。如果建立索引,不但不會提高查詢效率,反而會嚴重降低更新速度。

  ◊ 當唯一性是某種資料本身的特徵時,指定唯一索引。使用唯一索引能夠確保定義的列的資料完整性,提供查詢速度。

  ◊ 在頻繁進行排序和分組(GROUP BY或ORDER BY)的列上建立索引,如果排序的列有多個,可以在這些列上建立組合索引。

2. 建立索引常用的規則

  ◊ 表的主鍵、外來鍵必須有索引;

  ◊ 資料量超過300的表應該有索引;

  ◊ 經常與其他表進行連線的表,在連線欄位上應該建立索引;

  ◊ 經常出現在WHERE字句中的欄位,特別是大表的欄位,應該建立索引;

  ◊ 索引應該建在選擇性高的欄位上;

  ◊ 索引應該建在小欄位上,對於大的文字欄位甚至超長欄位,不要建索引;

  ◊ 頻繁進行資料操作的表,不要建立太多的索引;

  ◊ 刪除無用的索引,避免對執行計劃造成負面影響。

3. 查詢優化原則

  ◊ 避免對列的操作。

  任何對列的操作都可能導致全表掃描,這裡所謂的操作包括資料庫函式、計算表示式等,查詢時要儘可能將操作移至等式的右邊,甚至去掉函式。

  示例:

SELECT * FROM [dbo].[Product] WHERE [UnitPrice] / 10 > 3

  ◊ 避免不必要的型別轉換

  ◊ 增加查詢的範圍限制,避免全範圍的查詢

  ◊ 儘量去掉 IN、OR

  ◊ 儘量去掉 <>

  ◊ 去掉WHERE字句中的IS NULL和IS NOT NULL。WHERE字句中的IS NULL和IS NOT NULL將不會使用索引而是進行全表搜尋。

  ◊ LIKE字句儘量前段匹配

  ◊ 建立基於函式的索引。前面談到任何對列的操作都可能導致全表掃描,但是這種查詢在系統中經常需要使用,這時可以建立一個基於函式的索引。

  示例:

CREATE INDEX IX_ProductName ON [dbo].[Product] (CONVERT(VARCHAR(8), [CreateDate], 112))

相關文章