SQL Server 索引使用和优化
生活随笔
收集整理的這篇文章主要介紹了
SQL Server 索引使用和优化
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
索引的使用說明
題外話:
? ???昨天比較郁悶,維護一客戶的數(shù)據(jù)庫系統(tǒng)時候,發(fā)現(xiàn)系統(tǒng)處理數(shù)據(jù)就出現(xiàn)假死。
開始因為是軟件問題,拷得亂忙一下午還沒有拷定,后來一直弄到晚上7點,突然想起索引問題。
后來就使用了一命令: dbcc?dbreindex('TableName','',80)
即可實現(xiàn)。比較郁悶和暈,自己犯這樣的錯誤。
? ???這錯誤,正好是我想寫這帖的原因,希望能為大家解決一些實際問題吧。
正題:
為什么要建立合適的索引,重要的目的就是提高查詢效率。
這里簡單說一下索引的兩種類型:
幫助的說明 聚集
聚集索引基于數(shù)據(jù)行的鍵值在表內(nèi)排序和存儲這些數(shù)據(jù)行。由于數(shù)據(jù)行按基于聚集索引鍵的排序次序存儲,因此聚集索引對查找行很有效。每個表只能有一個聚集索引,因為數(shù)據(jù)行本身只能按一個順序存儲。數(shù)據(jù)行本身構(gòu)成聚集索引的最低級別。
只有當表包含聚集索引時,表內(nèi)的數(shù)據(jù)行才按排序次序存儲。如果表沒有聚集索引,則其數(shù)據(jù)行按堆集方式存儲。
非聚集
非聚集索引具有完全獨立于數(shù)據(jù)行的結(jié)構(gòu)。非聚集索引的最低行包含非聚集索引的鍵值,并且每個鍵值項都有指針指向包含該鍵值的數(shù)據(jù)行。數(shù)據(jù)行不按基于非聚集鍵的次序存儲。
在非聚集索引內(nèi),從索引行指向數(shù)據(jù)行的指針稱為行定位器。行定位器的結(jié)構(gòu)取決于數(shù)據(jù)頁的存儲方式是堆集還是聚集。對于堆集,行定位器是指向行的指針。對于有聚集索引的表,行定位器是聚集索引鍵。
來的例子說明最能體現(xiàn)建立索引的好處。
? --測試表DTest?(無索引)
SELECT?IDENTITY(int,1,1)?AS?[id],B.[id]?AS?TKey,B.[Name]?AS?[TName]?INTO?DTest?
FROM?Master..syscolumns?AS?A?,Master..sysobjects?AS?B
--測試表TTest?(建立索引)
SELECT?IDENTITY(int,1,1)?AS?[id],B.[id]?AS?TKey,B.[Name]?AS?[TName]?INTO?TTest?
FROM?Master..syscolumns?AS?A?,Master..sysobjects?AS?B
在我的測試中,DTest,TTest表有500多萬條記錄,可以滿足測試要求。
操作如圖:
1、設(shè)置表TTest的字段ID為主鍵。
?
2、對表TTest中的列TName建立一個非聚集索引。
?
3、測試查詢語句的效率。
在查詢分析器中輸入: SELECT?*?FROM??DTest?WHERE?TName='sp_ActiveDirectory_Obj'
按鍵盤Ctrl+L,顯示預(yù)計的執(zhí)行計劃,可以查看執(zhí)行效率。
?
預(yù)計的成本是31.8.
再在查詢分析器中輸入:
SELECT?*?FROM??TTest?WHERE?TName='sp_ActiveDirectory_Obj'
按鍵盤Ctrl+L,顯示預(yù)計的執(zhí)行計劃,可以查看執(zhí)行效率。
?
預(yù)計的成本是28.5 .
從這圖可以看出,使用索引后,查詢效率差不多提高了10的百分點。
下面我們再看實際查詢的結(jié)果用時:
沒有索引時候,用時:26秒。
?
對列Tname加索引,用時:0秒。
呵呵,明顯看出效率的提高。
這里寫幾點注意:
1、將更新盡可能多的行的查詢寫入單個語句內(nèi),而不要使用多個查詢更新相同的行。僅使用一個語句,就可以利用優(yōu)化的索引維護。
2、對聚集索引使用整型鍵。另外,在唯一列、非空列或 IDENTITY 列上創(chuàng)建聚集索引可以獲得性能收益
3、在查詢經(jīng)常用到的所有列上創(chuàng)建非聚集索引。這可以最大程度地利用隱蔽查詢
4、重建索引可以重新組織索引數(shù)據(jù)(對于聚集索引還包括表數(shù)據(jù))的存儲,清除碎片。如我開始提到的使用
dbcc?dbreindex('TableName','',80)
來重構(gòu)索引。
在實際的應(yīng)用中,會發(fā)現(xiàn)很多問題,得具體問題具體分析,這里只是簡單一個例子說明使用索引的好處。
題外話:
? ???昨天比較郁悶,維護一客戶的數(shù)據(jù)庫系統(tǒng)時候,發(fā)現(xiàn)系統(tǒng)處理數(shù)據(jù)就出現(xiàn)假死。
開始因為是軟件問題,拷得亂忙一下午還沒有拷定,后來一直弄到晚上7點,突然想起索引問題。
后來就使用了一命令: dbcc?dbreindex('TableName','',80)
即可實現(xiàn)。比較郁悶和暈,自己犯這樣的錯誤。
? ???這錯誤,正好是我想寫這帖的原因,希望能為大家解決一些實際問題吧。
正題:
為什么要建立合適的索引,重要的目的就是提高查詢效率。
這里簡單說一下索引的兩種類型:
幫助的說明 聚集
聚集索引基于數(shù)據(jù)行的鍵值在表內(nèi)排序和存儲這些數(shù)據(jù)行。由于數(shù)據(jù)行按基于聚集索引鍵的排序次序存儲,因此聚集索引對查找行很有效。每個表只能有一個聚集索引,因為數(shù)據(jù)行本身只能按一個順序存儲。數(shù)據(jù)行本身構(gòu)成聚集索引的最低級別。
只有當表包含聚集索引時,表內(nèi)的數(shù)據(jù)行才按排序次序存儲。如果表沒有聚集索引,則其數(shù)據(jù)行按堆集方式存儲。
非聚集
非聚集索引具有完全獨立于數(shù)據(jù)行的結(jié)構(gòu)。非聚集索引的最低行包含非聚集索引的鍵值,并且每個鍵值項都有指針指向包含該鍵值的數(shù)據(jù)行。數(shù)據(jù)行不按基于非聚集鍵的次序存儲。
在非聚集索引內(nèi),從索引行指向數(shù)據(jù)行的指針稱為行定位器。行定位器的結(jié)構(gòu)取決于數(shù)據(jù)頁的存儲方式是堆集還是聚集。對于堆集,行定位器是指向行的指針。對于有聚集索引的表,行定位器是聚集索引鍵。
來的例子說明最能體現(xiàn)建立索引的好處。
? --測試表DTest?(無索引)
SELECT?IDENTITY(int,1,1)?AS?[id],B.[id]?AS?TKey,B.[Name]?AS?[TName]?INTO?DTest?
FROM?Master..syscolumns?AS?A?,Master..sysobjects?AS?B
--測試表TTest?(建立索引)
SELECT?IDENTITY(int,1,1)?AS?[id],B.[id]?AS?TKey,B.[Name]?AS?[TName]?INTO?TTest?
FROM?Master..syscolumns?AS?A?,Master..sysobjects?AS?B
在我的測試中,DTest,TTest表有500多萬條記錄,可以滿足測試要求。
操作如圖:
1、設(shè)置表TTest的字段ID為主鍵。
?
2、對表TTest中的列TName建立一個非聚集索引。
?
3、測試查詢語句的效率。
在查詢分析器中輸入: SELECT?*?FROM??DTest?WHERE?TName='sp_ActiveDirectory_Obj'
按鍵盤Ctrl+L,顯示預(yù)計的執(zhí)行計劃,可以查看執(zhí)行效率。
?
預(yù)計的成本是31.8.
再在查詢分析器中輸入:
SELECT?*?FROM??TTest?WHERE?TName='sp_ActiveDirectory_Obj'
按鍵盤Ctrl+L,顯示預(yù)計的執(zhí)行計劃,可以查看執(zhí)行效率。
?
預(yù)計的成本是28.5 .
從這圖可以看出,使用索引后,查詢效率差不多提高了10的百分點。
下面我們再看實際查詢的結(jié)果用時:
沒有索引時候,用時:26秒。
?
對列Tname加索引,用時:0秒。
呵呵,明顯看出效率的提高。
這里寫幾點注意:
1、將更新盡可能多的行的查詢寫入單個語句內(nèi),而不要使用多個查詢更新相同的行。僅使用一個語句,就可以利用優(yōu)化的索引維護。
2、對聚集索引使用整型鍵。另外,在唯一列、非空列或 IDENTITY 列上創(chuàng)建聚集索引可以獲得性能收益
3、在查詢經(jīng)常用到的所有列上創(chuàng)建非聚集索引。這可以最大程度地利用隱蔽查詢
4、重建索引可以重新組織索引數(shù)據(jù)(對于聚集索引還包括表數(shù)據(jù))的存儲,清除碎片。如我開始提到的使用
dbcc?dbreindex('TableName','',80)
來重構(gòu)索引。
在實際的應(yīng)用中,會發(fā)現(xiàn)很多問題,得具體問題具體分析,這里只是簡單一個例子說明使用索引的好處。
轉(zhuǎn)載于:https://www.cnblogs.com/kingjiong/archive/2010/03/07/1680423.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server 索引使用和优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迅雷并非一无是处啊
- 下一篇: 高性能SQLServer通用分页存储过程