Index

為什麼當我在 SQL 上使用變數時,數據庫引擎會避開索引?

  • October 14, 2020

我正在改進我們的 SSIS 流程,通過 a 傳遞變數declare,我發現了這一點:

在這裡,您可以使用變數brentozar.com/pastetheplan/?id=rkSxs7VPv執行以下語句的計劃:

select *
from fact_Venta
where Data_ID >= @data1
and Data_ID <= @data2

這裡沒有變數brentozar.com/pastetheplan/?id=SJ8soXEww

SELECT * 
FROM [fact_Venta] 
WHERE [Data_ID]>=@1 
AND [Data_ID]<=@2

如您所見,當我使用declareSQL 數據庫引擎時不使用索引。所使用的索引對於where.

兩次執行都在同一台伺服器上,具有相同的設置選項並同時執行。

為什麼您認為使用變數而不是參數會提高性能?

使用局部變數,該計劃針對未知值進行優化,使用從統計中收集的平均密度值來估計行數。使用參數 OTOH,SQL Server 使用為初始編譯提供的實際參數值來估計行數。這通常會提供更優化的計劃,但存在重複使用對於不同值不是最佳的記憶體計劃的風險。

我建議您使用參數化查詢並確保統計資訊是最新的。向查詢添加OPTION (RECOMPILE)提示以避免範圍查詢的參數嗅探。這將避免重用次優計劃,並且在 SSIS 相對不經常執行的大型查詢的情況下編譯成本是微不足道的。應該明智地使用重新編譯提示,並且不適合每秒執行多次的 OLTP 工作負載查詢。

請注意,當指定重新編譯提示時,會使用參數或變數來嗅探實際值。

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