用索引提高SQL Server效能

2021-09-07 22:18:23 字數 3162 閱讀 5411

用索引提高sql server效能url: 

特別說明:

在微軟的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資料處理的效率

在良好的資料庫設計基礎上,能有效地使用索引是sql server取得高效能的基礎,sql server採用基於代價的優化模型,它對每乙個提交的有關表的查詢,決定是否使用索引或用哪乙個索引。因為查詢執行的大部分開銷是磁碟i o,使用索引提高效能的乙個主要目標是避免全表掃瞄,因為全表掃瞄需要從磁碟上讀表...

SQL Server索引怎麼用

什麼是索引 拿漢語字典的目錄頁 索引 打比方 正如漢語字典中的漢字按頁存放一樣,sql server中的資料記錄也是按頁存放的,每頁容量一般為4k 為了加快查詢的速度,漢語字 詞 典一般都有按拼音 筆畫 偏旁部首等排序的目錄 索引 我們可以選擇按拼音或筆畫查詢方式,快速查詢到需要的字 詞 同理,sq...

利用索引提高SQL Server資料處理的效率

在良好的資料庫設計基礎上,能有效地使用索引是sql server取得高效能的基礎,sql server採用基於代價的優化模型,它對每乙個提交的有關表的查詢,決定是否使用索引或用哪乙個索引。因為查詢執行的大部分開銷是磁碟i o,使用索引提高效能的乙個主要目標是避免全表掃瞄,因為全表掃瞄需要從磁碟上讀表...