用索引提高SQL Server性能

在關係型數據庫中使用索引能夠提高數據庫性能,這一點是非常明顯的。用的索引越多,從數據庫系統中得到數據的速度就越快。然而,需要注意的是,用的索引越多,向數據庫系統中插入新數據所花費的時間就越多。在本文中,你將瞭解到微軟的SQL Server數據庫所支持的各種不同類型的索引,在這裏你將瞭解到如何使用不同的方法來實現索引,通過這些不同的實現方法,你在數據庫的讀性能方面得到的遠比在數據庫的整體性能方面的損失要多得多。

索引的定義
索引是數據庫的工具,通過使用索引,在數據庫中獲取數據的時候,就可以不用掃描數據庫中的所有數據記錄,這樣能夠提高系統獲取數據的性能。使用索引可以改變數據的組織方式,使得所有的數據都是按照相似的結構來組織的,這樣就可以很容易地實現數據的檢索訪問。索引是按照列來創建的,這樣就可以根據索引列中的值來幫助數據庫找到相應的數據。

索引的類型
微軟的SQL Server 支持兩種類型的索引:clustered 索引和nonclustered索引。Clustered 索引在數據表中按照物理順序存儲數據。因爲在表中只有一個物理順序,所以在每個表中只能有一個clustered索引。在查找某個範圍內的數據時,Clustered索引是一種非常有效的索引,因爲這些數據在存儲的時候已經按照物理順序排好序了。

Nonclustered索引不會影響到下面的物理存儲,但是它是由數據行指針構成的。如果已經存在一個clustered索引,在nonclustered中的索引指針將包含clustered索引的位置參考。這些索引比數據更緊促,而且對這些索引的掃描速度比對實際的數據表掃描要快得多。

如何實現索引
數據庫可以自動創建某些索引。例如,微軟的SQL Server系統通過自動創建唯一索引來強制實現UNIQUE約束,這樣可以確保在數據庫中不會插入重複數據。也可以使用CREATE INDEX語句或者通過SQL Server Enterprise Manager來創建其他索引,SQL Server Enterprise Manager還有一個索引創建模板來指導你如何創建索引。

得到更好的性能
雖然索引可以帶來性能上的優勢,但是同時也將帶來一定的代價。雖然SQL Server系統允許你在每個數據表中創建多達256個nonclustered索引,但是建議不要使用這麼多的索引。因爲索引需要在內存和物理磁盤驅動器上使用更多的存儲空間。在執行插入聲明的過程中可能會在一定程度上導致系統性能的下降,因爲在插入數據的時候是需要根據索引的順序插入,而不是在第一個可用的位置直接插入數據,這樣一來,存在的索引越多將導致插入或者更新聲明所需要的時間就越多。

在使用SQL Server系統創建索引的時候,建議參照下面的創建準則來實現:


正確的選擇數據類型:在索引中使用某些數據類型可以提高數據庫系統的效率,例如,Int,bigint, smallint,和tinyint等這些數據類型都非常適合於用在索引中,因爲他們都佔用相同大小的空間並且可以很容易地實現比較操作。其他的數據類型如char和varchar的效率都非常低,因爲這些數據類型都不適合於執行數學操作,並且執行比較操作的時間都比上面提到數據類型要長。

確保在使用的過程中正確的利用索引值:在執行查詢操作時,可能所使用的列只是clustered的一部分,這時尤其要注意的是如何使用這些數據。當用這些數據列作爲參數調用函數時,這些函數可能會使現有的排序優勢失效。例如,使用日期值作爲索引,而爲了實現比較操作,可能需要將這個日期值轉換爲字符串,這樣將導致在查詢過程中無法用到這個日期索引值。

在創建多列索引時,需要注意列的順序:數據庫將根據第一列索引的值來排列記錄,然後進一步根據第二列的值來排序,依次排序直到最後一個索引排序完畢。哪一列唯一數據值較少,哪一列就應該爲第一個索引,這樣可以確保數據可以通過索引進一步交叉排序。

在clustered索引中限制列的數量:在clustered索引中用到的列越多,在nonclustered索引中包含的clustered索引參考位置就越多,需要存儲的數據也就越多。這樣將增加包含索引的數據表的大小,並且將增加基於索引的搜索時間。

避免頻繁更新clustered索引數據列:由於nonclustered 索引依賴於clustered 索引,所以如果構成clustered 索引的數據列頻繁更新,將導致在nonclustered中存儲的行定位器也將隨之頻繁更新。對於所有與這些列相關的查詢來說,如果發生記錄被鎖定的情況時,這將可能導致性能成本的增加。

分開操作(如果可能的話):對於一個表來說,如果需要進行頻繁的執行插入、更新操作,同時還有大量讀操作的話,在可能的情況下嘗試將這個表分開操作。所有的插入和更新操作可以在一個沒有索引的表中操作,然後將其複製到另外一個表中,在這個表裏有大量的索引可以優化讀數據的能力。

適當的重建索引:Nonclustered索引包含clustered索引的指針,這樣一來Nonclustered索引將從屬於clustered 索引。當重建clustered索引時,首先是丟棄原來的索引,然後再使用CREATE INDEX 來創建索引,或者在使用CREATE INDEX 聲明的同時將DROP_EXISTING 子句作爲重建索引的一部分。將丟棄和創建分爲幾步將會導致多次重建nonclustered 索引,而不象使用DROP_EXISTING 子句那樣,只重建一次nonclustered 索引。

明智的使用填充因子:數據存儲在那些具有固定大小的連續內存頁面內。隨着新的記錄行的加入,數據內存頁將逐漸被填滿,系統就必須執行數據頁的拆分工作,通過這個拆分工作將部分數據轉移到下一個新的頁面當中。這樣的拆分之後,將加重系統的負擔,並且會導致存儲的數據支離破碎。填充因子可以維護數據之間的缺口,一般在創建索引的時候,該索引的填充因子就已經被設置好了。這樣一來,可以減少插入數據所引起的頁面分裂的次數。因爲只是在創建索引的時候才維護空間的大小,在增加數據或者更新數據時不會去維護空間的大小。因此,要想能夠充分的利用填充因子,就必須週期性的重建索引。由填充因子所造成的缺口將導致讀性能的下降,因爲隨着數據庫的擴張,越來越多的磁盤存取工作需要讀取數據。所以,在讀的次數超過寫的次數的時候,很重要的一點是考慮使用填充因子還是使用缺省方式合適。
管理層的決策
通過有效的使用索引,可以在微軟的SQL Server系統中實現很好的查詢功能,但是使用索引的效率取決於幾種不同的實現決策。在索引的性能平衡方面,要做出正確的數據庫管理決策意味着需要在良好的性能和困境中抉擇。在特定的情況下,本文給出的一些建議將有助於你做出正確的決策。(
 http://www.zdnet.com.cn/techupdate/implement/apply/datebase/story/0,3800072464,39214036,00.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章