用索引提高SQL Server效能
最後更新:2018-12-07
來源:互聯網
上載者:User
特別說明 在微軟的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系統中實現很好的查詢功能,但是使用索引的效率取決於幾種不同的實現決策。在索引的效能平衡方面,要做出正確的資料庫管理決策意味著需要在良好的效能和困境中抉擇。在特定的情況下,本文給出的一些建議將有助於你做出正確的決策。