六、有關索引的幾個問題
問題1,是否值得在identity欄位上建立聚集索引。答案取決於identity 字段如何在語句中使用。如果你經常根據該欄位搜尋返回很少的行,那麼在其上建立索引是值得的。反之如果identity欄位根本很少在語句中使用,那麼就不應該對其建立任何索引。
問題2,乙個表應該建立多少索引合適。如果表的80%以上的語句都是讀操作,那麼索引可以多些。但是不要太多。特別是不要對那些更新頻繁的表其建立很多的索引。很少表有超過5個以上的索引。過多的索引不但增加其占用的磁碟空間,也增加了sql server 維護索引的開銷。
問題4:為什麼sql server 在執行計畫中沒有使用你認為應該使用的索引?原因是多樣的。一種原因是該語句返回的結果超過了表的20%資料,使得sql server 認為scan比seek更有效。
另一種原因可能是表字段的statistics過期了,不能準確反映資料的分布情況。你可以使用命令update statistics tablename with fullscan來更新它。只有同步的準確的statistics才能保證sql server 產生正確的執行計畫。過時的老的statistics常會導致sql server生成不夠優化的甚至愚蠢的執行計畫。所以如果你的表頻繁更新,而你又覺得和之相關的sql語句執行緩慢,不妨試試update statistic with fullscan 語句。
你甚至可以使用index hint比較不同索引的效能差異。比如對上面script 4提到的兩個索引,可以這樣比較,
select 學生姓名, 入學時間 from tbl1 with (index= idx_年齡入學時間)
where ……
或者:select 學生姓名, 入學時間 from tbl1 with (index= idx_入學時間年齡)
where ……
如果強制使用你的索引後logical reads大大減少,那麼就需要進一步研究為什麼sql server 不使用正確的索引。注意,不要總是將使用索引等同於好的效能,反之亦然。sql server只在索引能提高效能時才使用索引檢索。有時候使用table scan的效能比使用某個索引反而要好。
問題5、什麼使用聚集索引,什麼時候使用非聚集索引
在sql server 中索引有聚集索引和非聚集索引兩種。它們的主要差別是前者的索引葉子就是資料本身,而後者的葉子節點包含的是指向資料的書籤(即資料行號或聚集索引的key)。
在上面的例子中我全部使用非聚集索引,原因是對乙個表而言聚集索引只能有乙個,而非聚集索引可以有多個。如果你把上面例子中的非聚集索引換成聚集索引,效果也是類似的,只是聚集索引沒有bookmark lookup操作。什麼時候應該使用聚集索引,什麼時候使用非聚集索引取決於應用程式的訪問模式。我的建議是在那些關鍵的字段上使用聚集索引。乙個表一般都需要建立乙個聚集索引。對於什麼時候使用聚集索引,sql server 2000聯機手冊中有如下描述:
在建立聚集索引之前,應先了解您的資料是如何被訪問的。可考慮將聚集索引用於:
聚集索引不適用於:
這將導致整行移動(因為
sql server 必須按物理順序保留行中的資料值)。這一點要特別注意,因為在大資料量事務處理系統中資料是易失的。
來自聚集索引的鍵值由所有非聚集索引作為查詢鍵使用,因此儲存在每個非聚集索引的葉條目內。
七、結束語
如何使乙個效能緩慢的系統執行更快更高效,不但需要整體分析資料庫系統,找出系統的效能瓶頸,更需要優化資料庫系統發出的sql 語句。一旦找出關鍵的sql 語句並加與優化,效能問題就會迎刃而解。讀完本文,你應該知道建立索引的關鍵是什麼,以及如何分析sql語句的執行計畫來建立索引。在優化了索引後大部分資料庫系統的效能都能夠得到不同程度的改善,有的系統甚至能夠獲得好幾倍以上的效能提公升。本文並不能解決你在優化sql語句中碰到的所有問題,但其中討論的內容或技巧對許多效能問題都有一定的參考意義。
應用索引技術優化SQL 語句 Part 3
六 有關索引的幾個問題 問題1,是否值得在 identity欄位上建立聚集索引。答案取決於identity 字段如何在語句中使用。如果你經常根據該欄位搜尋返回很少的行,那麼在其上建立索引是值得的。反之如果identity欄位根本很少在語句中使用,那麼就不應該對其建立任何索引。問題2,乙個表應該建立多...
應用索引技術優化SQL 語句 Part 2
四 分析執行計畫建立索引 根據語句的執行計畫來判斷應該對什麼表建立什麼索引,是常用優化技巧。其實文章前面的例子已經告訴讀者如何結合statistics profile 和statistics io語句的輸出來建立索引。這裡分析乙個稍微複雜一些的例子。sql語句如下 select currentsen...
SQL語句優化技術分析
一 操作符優化 1 in 操作符 2 not in操作符 3 is null 或is not null操作 4 及 操作符 大於或小於操作符 乙個數值型字段a,30萬記錄的a 0,30萬記錄的a 1,39萬記錄的a 2,1萬記錄的a 3。那麼執行a 2與a 3的效果就有很大的區別了,因為a 2時or...