在我的SELECT語句中,我使用的可選參數的方式是這樣的:可選參數,「索引查找」計劃
DECLARE @p1 INT = 1
DECLARE @p2 INT = 1
SELECT name FROM some_table WHERE (id = @p1 OR @p1 IS NULL) AND (name = @p2 OR @p2 IS NULL)
在這種情況下,優化器生成「索引掃描」(不求)操作的實體當參數提供非空值時,這不是最有效的。
如果我將RECOMPILE提示添加到查詢中,優化器將使用「seek」構建更有效的計劃。它適用於我的MSSQL 2008 R2 SP1服務器,這也意味着優化器可以構建一個只考慮我的查詢的一個邏輯分支的計劃。
我該如何使它能夠在任何地方使用該計劃,而不需要重新編譯?在這種情況下,USE PLAN暗示圖標不起作用。
下面是測試代碼:
-- see plans
CREATE TABLE test_table(
id INT IDENTITY(1,1) NOT NULL,
name varchar(10),
CONSTRAINT [pk_test_table] PRIMARY KEY CLUSTERED (id ASC))
GO
INSERT INTO test_table(name) VALUES ('a'),('b'),('c')
GO
DECLARE @p INT = 1
SELECT name FROM test_table WHERE id = @p OR @p IS NULL
SELECT name FROM test_table WHERE id = @p OR @p IS NULL OPTION(RECOMPILE)
GO
DROP TABLE test_table
GO
請注意,並非所有的SQL Server版本將改變我的計劃顯示的方式。
謝謝你的回覆。是的,我知道其他解決方法與尋求 - 使用IFs,重構SQL等。但很遺憾,我不能提供查詢與優化器只爲這個查詢建立的計劃... – LINQ2Vodka