Sql-Server

強制 SQL Server 使用碎片索引?

  • August 29, 2019

我有一個非常大的表(>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 來強制執行計劃。這比使用計劃指南要容易得多,但您最終可能會得到一個意想不到的計劃

缺點:

  • 和上面一樣的東西
  • 必須啟用查詢儲存,如果您還沒有使用它
  • 必須查詢查詢儲存以查看強制計劃是否失敗

備擇方案

在不了解更多資訊的情況下,我可能更熱衷於調查索引使用是否因其他原因而更改,例如參數嗅探

引用自:https://dba.stackexchange.com/questions/246355