最佳化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中選擇重新組織資料和資料頁,這將停止舊有索引並按特定的填充因子重建索引。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2693435/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server索引 - 非聚集索引SQLServer索引
- SQL Server 2014的重建索引SQLServer索引
- SQL Server 索引結構SQLServer索引
- SQL SERVER實用技巧SQLServer
- sql最佳化技巧SQL
- 【SQL】Oracle資料庫sql最佳化小技巧索引不管用怎麼辦01SQLOracle資料庫索引
- SQL Server2014 雜湊索引原理SQLServer索引
- SQL效能最佳化之索引最佳化法SQL索引
- 針對SQL Server的最佳化建議SQLServer
- sql server 索引闡述系列七 索引填充因子與碎片SQLServer索引
- 理解SQL Server 2008索引的儲存結構YDSQLServer索引
- 關於SQL Server索引的最左匹配原則SQLServer索引
- SQL最佳化案例-正確的使用索引(二)SQL索引
- SQL最佳化案例-分割槽索引之無字首索引(六)SQL索引
- SQL Server 資料太多如何最佳化SQLServer
- 如何在SQL Server中最佳化TempdbSQLServer
- Sql Server關於indexed view索引檢視的總結SQLServerIndexView索引
- MySQL SQL最佳化 - 覆蓋索引(covering index)MySql索引Index
- 資料庫最佳化技巧 - SQL語句最佳化資料庫SQL
- SQL Server升級和遷移的三個技巧GZSQLServer
- SQL最佳化案例-自定義函式索引(五)SQL函式索引
- SQL Server 資料庫 最佳化 效能瓶頸SQLServer資料庫
- PG資料庫SQL最佳化小技巧資料庫SQL
- SQL Server 2012新功能巡禮:列儲存索引YXSQLServer索引
- SQL Server 列儲存索引 第一篇:概述SQLServer索引
- SQL Server 列儲存索引 第三篇:維護SQLServer索引
- SQL Server 列儲存索引 第二篇:設計SQLServer索引
- SQL Server 全文搜尋功能、全文索引方式介紹SQLServer索引
- 第79篇 SQL Server資料庫如何最佳化SQLServer資料庫
- SQL Server最佳化必備之任務排程SQLServer
- 關於SQL Server中索引使用及維護簡介(zt)SQLServer索引
- 【Python入門教程】五個常見的最佳化SQL的技巧!PythonSQL
- Sql Server關於create index include帶有包含列的索引的最全解釋SQLServerIndex索引
- MySQL的索引最佳化MySql索引
- 適用於SQL Server生產環境DBA的七大技巧SQLServer
- sql serverSQLServer
- 「分散式技術專題」SQL最佳化的前置條件和最佳化技巧分享分散式SQL
- SQL Server索引查詢/掃描沒有出現key lookup的案例淺析SQLServer索引