【发布时间】:2011-08-18 08:39:19
【问题描述】:
在我的 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 都会按照我显示的方式更改计划。
【问题讨论】:
标签: sql sql-server optional-parameters sql-execution-plan