微調和維護索引
微調 T-SQL 查詢的最常見 (及最有效) 方法,就是評估及調整索引策略。 正確編製索引的資料庫會執行較少 IO 以傳回查詢結果,而較少的 IO 則會降低 IO 和儲存體系統壓力。 減少 IO 甚至可提供更好的記憶體使用率。 請記住您查詢的讀取/寫入比率。
大量寫入工作負載可能表示將資料列寫入額外索引並不符合成本效益。 但如果工作負載主要是執行同時需要執行「查閱」作業的更新則除外。 將額外索引或將資料行新增至現有的索引,可能會對執行查閱的更新作業有所幫助。 您的目標應該一律是從資料表上最少索引獲得最大效益。
常見的效能微調方法如下:
使用
sys.dm_db_index_operational_stats
和sys.dm_db_index_usage_stats
評估現有的索引使用方式。請考慮排除未使用和重複的索引,但應謹慎進行。 某些索引可能只會在每月/每季/每年作業期間使用,而且對這些流程來說可能很重要。 您也可以考慮在排程作業之前,建立索引支援這些作業,以降低資料表上有未使用索引的額外負荷。
請從查詢存放區 (或擴充事件擷取) 檢閱和評估成本高的查詢,並致力於手動編製索引以更妥善地提供這些查詢。
在非生產環境中建立索引,然後測試查詢執行和效能,並觀察效能變更。 請務必注意您生產與非生產環境之間的任何硬體差異,因為記憶體數量和 CPU 數目可能會影響執行計畫。
仔細測試之後,請對生產系統實作變更。
確認索引的資料行順序:前置資料行會驅動資料行統計資料,而且通常會判斷最佳化工具是否會選擇索引。 在理想的情況下,前置資料行為選擇性,並可用於許多查詢的 WHERE
子句中。 請考慮使用變更控制流程,追蹤可能會影響應用程式效能的變更。 在卸除索引之前,請將程式碼儲存在原始檔控制中,如此一來,如果不常執行的查詢需要索引正常執行,就可以快速地重新建立索引。
最後,用於相等比較的資料行應該在用於不相等比較的資料行前面,而且具有更高選擇性的資料行應該在具有較少相異值的資料行前面。
可繼續索引
可繼續索引可讓索引維護作業暫停,或在某個時間範圍內進行,並於稍後繼續。 使用可繼續索引作業來降低忙碌生產環境中索引維護的影響,就是一個很好的範例。 然後,您可在特定維護時段執行重建作業,以更進一步控制流程。
此外,為大型資料表建立索引可能會對整個資料庫系統的效能造成負面影響。 在 SQL Server 2019 之前的版本中修正此問題的唯一方式是終止索引建立流程。 然後,如果系統復原工作階段,則必須從頭開始流程。
使用可繼續索引,您可以暫停建立作業,然後在稍後從暫停位置重新開始。
下列範例示範如何建立可繼續索引:
-- Creates a nonclustered index for the Customer table
CREATE INDEX IX_Customer_PersonID_ModifiedDate
ON Sales.Customer (PersonID, StoreID, TerritoryID, AccountNumber, ModifiedDate)
WITH (RESUMABLE=ON, ONLINE=ON)
GO
在查詢視窗中,暫停索引作業:
ALTER INDEX IX_Customer_PersonID_ModifiedDate ON Sales.Customer PAUSE
GO
上述陳述式會使用 PAUSE
子句暫停建立可繼續線上索引。
您可以透過查詢 sys.index_resumable_operations
系統檢視,檢查可繼續線上索引的目前執行狀態。
注意
只有線上作業才支援可繼續索引。