優化SQLServer索引的小技巧數據庫
SQL Server中有幾個可讓你檢測、調整和優化SQL Server性能的工具。在本文中,我將說明如何用SQL Server的工具來優化數據庫索引的使用,本文還涉及到有關索引的通常性知識。
關於索引的常識
影響到數據庫性能的最大因素就是索引。因爲該問題的複雜性,我只可能簡單的談談這個問題,不過關於這方面的問題,目前有好幾本不錯的書籍可供你參閱。我在這裏只討論兩種SQL Server索引,即clustered索引和nonclustered索引。當考察創建什麼類型的索引時,你應當考慮數據類型和保存這些數據的 column。一樣,你也必須考慮數據庫可能用到的查詢類型以及使用的最爲頻繁的查詢類型。
索引的類型
若是column保存了高度相關的數據,而且經常被順序訪問時,最好使用clustered索引,這是由於若是使用clustered索引,SQL Server會在物理上按升序(默認)或者降序重排數據列,這樣就能夠迅速的找到被查詢的數據。一樣,在搜尋控制在必定範圍內的狀況下,對這些 column也最好使用clustered索引。這是由於因爲物理上重排數據,每一個表格上只有一個clustered索引。
與上面狀況相反,若是columns包含的數據相關性較差,你可使用nonculstered索引。你能夠在一個表格中使用高達249個nonclustered索引--儘管我想象不出實際應用場合會用的上這麼多索引。
當表格使用主關鍵字(primary keys),默認狀況下SQL Server會自動對包含該關鍵字的column(s)創建一個獨有的cluster索引。很顯然,對這些column(s)創建獨有索引意味着主關鍵字的惟一性。當創建外關鍵字(foreign key)關係時,若是你打算頻繁使用它,那麼在外關鍵字cloumn上創建nonclustered索引不失爲一個好的方法。若是表格有 clustered索引,那麼它用一個鏈表來維護數據頁之間的關係。相反,若是表格沒有clustered索引,SQL Server將在一個堆棧中保存數據頁。
數據頁
當索引創建起來的時候,SQLServer就創建數據頁(datapage),數據頁是用以加速搜索的指針。當索引創建起來的時候,其對應的填充因子也即被設置。設置填充因子的目的是爲了指示該索引中數據頁的百分比。隨着時間的推移,數據庫的更新會消耗掉已有的空閒空間,這就會致使頁被拆分。頁拆分的後果是下降了索引的性能,於是使用該索引的查詢會致使數據存儲的支離破碎。當創建一個索引時,該索引的填充因子即被設置好了,所以填充因子不能動態維護。
爲了更新數據頁中的填充因子,咱們能夠中止舊有索引並重建索引,並從新設置填充因子(注意:這將影響到當前數據庫的運行,在重要場合請謹慎使用)。 DBCC INDEXDEFRAG和DBCC DBREINDEX是清除clustered和nonculstered索引碎片的兩個命令。INDEXDEFRAG是一種在線操做(也就是說,它不會阻塞其它表格動做,如查詢),而DBREINDEX則在物理上重建索引。在絕大多數狀況下,重建索引能夠更好的消除碎片,可是這個優勢是以阻塞當前發生在該索引所在表格上其它動做爲代價換取來得。當出現較大的碎片索引時,INDEXDEFRAG會花上一段比較長的時間,這是由於該命令的運行是基於小的交互塊(transactional block)。
填充因子
當你執行上述措施中的任何一個,數據庫引擎能夠更有效的返回編入索引的數據。關於填充因子(fillfactor)話題已經超出了本文的範疇,不過我仍是提醒你須要注意那些打算使用填充因子創建索引的表格。
在執行查詢時,SQL Server動態選擇使用哪一個索引。爲此,SQL Server根據每一個索引上分佈在該關鍵字上的統計量來決定使用哪一個索引。值得注意的是,通過平常的數據庫活動(如插入、刪除和更新表格),SQL Server用到的這些統計量可能已經「過時」了,須要更新。你能夠經過執行DBCC SHOWCONTIG來查看統計量的狀態。當你認爲統計量已經「過時」時,你能夠執行該表格的UPDATE STATISTICS命令,這樣SQL Server就刷新了關於該索引的信息了。
創建數據庫維護計劃
SQL Server提供了一種簡化並自動維護數據庫的工具。這個稱之爲數據庫維護計劃嚮導(Database Maintenance Plan Wizard ,DMPW)的工具也包括了對索引的優化。若是你運行這個嚮導,你會看到關於數據庫中關於索引的統計量,這些統計量做爲日誌工做並定時更新,這樣就減輕了手工重建索引所帶來的工做量。若是你不想自動按期刷新索引統計量,你還能夠在DMPW中選擇從新組織數據和數據頁,這將中止舊有索引並按特定的填充因子重建索引。