Sql-Server
強制 SQL Server 使用碎片索引?
我有一個非常大的表(>10M 行),經常進行 crud 操作。它有適當的索引,但它們很快就會碎片化。如果沒有定期的索引重組/重建維護計劃,索引碎片很容易超過 90%。
現在我已經通過每天重新組織索引和每週重建來解決這個問題。我還嘗試了填充因子等以降低碎片。
我的主要問題是,當索引過於碎片化時,SQL Server 會忽略索引並改為執行全表掃描。發生這種情況時,它幾乎會殺死應用程序,因為重複掃描如此大的表非常繁重。我很確定在這些情況下使用碎片索引會更快。
有沒有辦法讓 SQL Server 使用索引而不考慮它的碎片?
索引提示
您可以使用索引提示來做到這一點:
SELECT * FROM dbo.Users AS u WITH (INDEX = ix_definitely_an_index) WHERE u.Reputation = 2;
缺點是:
- 可能會更改大量程式碼
- 如果重命名索引,則會中斷
- 如果您更改索引定義,它可能不再是最好的索引
計劃指南
您還可以使用計劃指南,它設置您想要的計劃。
缺點是:
- 它變幻無常;如果您的查詢不完全相同,您的計劃可能不會被使用
- 很難設置;你必須把一切都搞好
- 也與索引提示相同,所以呃……這很粗糙。
查詢商店?
由於您使用的是 SQL Server 2017,因此您可以使用Query Store 來強制執行計劃。這比使用計劃指南要容易得多,但您最終可能會得到一個意想不到的計劃。
缺點:
- 和上面一樣的東西
- 必須啟用查詢儲存,如果您還沒有使用它
- 必須查詢查詢儲存以查看強制計劃是否失敗
備擇方案
在不了解更多資訊的情況下,我可能更熱衷於調查索引使用是否因其他原因而更改,例如參數嗅探。