為什麼需要此密鑰查找?
我有一個公認的複雜查詢,我正在優化它,我被困在下一步。我已經將我的大部分問題定位到我的查詢的一部分,它正在執行以下密鑰查找,但我對它為什麼這樣做以及它為什麼這麼慢感到困惑。我什至沒有引用該表中的 PK。我正在做:
WHERE EXISTS (SELECT 1 FROM tblPriceTierQuantities [Extent8] INNER JOIN xxxx ON xxx=Extent8.AccountRateScheduleID WHERE Extent8.PriceTierID=tblPriceTiers.oid)
執行計劃的詳細資訊如下所示:
這顯示為唯一需要大量時間來執行的事情。確實,如果我只是註釋掉那個
WHERE Extent8.PriceTierID=tblPriceTiers.oid
子句,那麼查詢的速度就如我所願。問題是,這個查找似乎指向 Extent8 的 oid 而不是 tblPriceTier 的 oid 欄位。我很困惑為什麼它會因為這個查詢而命中該表上的聚集索引。此查詢中的任何其他內容都沒有命中該表。你能解釋一下為什麼存在這種集群查找,以及為什麼它可能這麼慢嗎?此 tblPriceTierQuantities 表上曾經引用的唯一列是
AccountRateScheduleID
andPriceTierID
, NEVERoid
這是此聚集索引中的唯一列。
您最近更新了統計數據嗎?估計的行數為 1,而實際的行數為 10,259,536… 過時的統計數據可能導致錯誤的查詢計劃(為連接和排序分配的記憶體不足,連接算法選擇錯誤…)。
當數據庫上的 Auto Update Statistics 設置為 true 時,SQL Server 將根據統計資訊中更改行的百分比(大約 20%)自動更新統計資訊。當表格很小但統計數據在更大的表格上可能會過時時,這很有效。包含 10000 條記錄的表中的統計資訊將在大約 2000 條記錄發生更改時自動更新(並且生活很好)。然而,對於具有 10000000 條記錄的表,自動更新仍將發生在 20% 或 2000000 條更改記錄處(導致一些非常糟糕的計劃和統計更新之間的長時間間隔)。
隨著 SQL Server 2008 R2 SP1(和所有未來版本)的發布,可以使用跟踪標誌 2371 將門檻值設置為動態值。這解決了大表問題。您可以在此處閱讀更多相關資訊:連結