3

我有以下查询

declare @EvalRemarks bit
select @EvalRemarks = 0

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

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

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

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

4

2 回答 2

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
于 2013-06-06T13:16:45.967 回答
1

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

If @EvalRemarks = 0 select ID from table
Else select ID from table
     where AC_Remarks like '%' + @RemarksFilter + '%'
于 2013-06-06T13:11:18.810 回答