我有以下查询
declare @EvalRemarks bit
select @EvalRemarks = 0
select ID from table
WHERE (@EvalRemarks = 0) OR (AC_Remarks like '%' + @RemarksFilter + '%'))
由于SQL是一种声明性语言,因此查询优化器将自行决定首先评估哪个部分。
我可以强制它先评估一个部位吗?这有可能与查询提示?
当我现在执行查询时需要17秒,当我删除where子句时需要1。
答案 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 + '%'