使用查询提示强制进行延迟评估

时间:2013-06-06 13:08:37

标签: sql-server tsql

我有以下查询

declare @EvalRemarks bit
select @EvalRemarks = 0

select ID from table
WHERE (@EvalRemarks = 0) OR (AC_Remarks like '%' + @RemarksFilter + '%'))

由于SQL是一种声明性语言,因此查询优化器将自行决定首先评估哪个部分。

我可以强制它先评估一个部位吗?这有可能与查询提示?

当我现在执行查询时需要17秒,当我删除where子句时需要1。

2 个答案:

答案 0 :(得分:3)

试试这个 -

DECLARE @EvalRemarks BIT
SELECT @EvalRemarks = 0

DECLARE @RemarksFilter VARCHAR(30)
SELECT @RemarksFilter = 'test'

SELECT ID FROM dbo.[table]
WHERE @EvalRemarks = 0 
    OR (@EvalRemarks = 1 AND AC_Remarks LIKE '%' + @RemarksFilter + '%')
OPTION (RECOMPILE)

或试试这个 -

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = 'SELECT ID FROM dbo.[table]' +
    CASE WHEN @EvalRemarks = 1 
        THEN 'AC_Remarks LIKE ''%' + @RemarksFilter + '%''' 
        ELSE '' 
    END

EXEC sys.sp_executesql @SQL

答案 1 :(得分:1)

这是因为在开头使用Like与通配符会强制查询优化器执行完整的表扫描。它不能使用可能在桌面上的任何索引 如果这是在存储过程中,您可以尝试...

If @EvalRemarks = 0 select ID from table
Else select ID from table
     where AC_Remarks like '%' + @RemarksFilter + '%'