Index
為什麼當我在 SQL 上使用變數時,數據庫引擎會避開索引?
我正在改進我們的 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
如您所見,當我使用
declare
SQL 數據庫引擎時不使用索引。所使用的索引對於where
.兩次執行都在同一台伺服器上,具有相同的設置選項並同時執行。
為什麼您認為使用變數而不是參數會提高性能?
使用局部變數,該計劃針對未知值進行優化,使用從統計中收集的平均密度值來估計行數。使用參數 OTOH,SQL Server 使用為初始編譯提供的實際參數值來估計行數。這通常會提供更優化的計劃,但存在重複使用對於不同值不是最佳的記憶體計劃的風險。
我建議您使用參數化查詢並確保統計資訊是最新的。向查詢添加
OPTION (RECOMPILE)
提示以避免範圍查詢的參數嗅探。這將避免重用次優計劃,並且在 SSIS 相對不經常執行的大型查詢的情況下編譯成本是微不足道的。應該明智地使用重新編譯提示,並且不適合每秒執行多次的 OLTP 工作負載查詢。請注意,當指定重新編譯提示時,會使用參數或變數來嗅探實際值。