我有一个看起来像这样的查询
SELECT TOP 1000 C.iId_company
FROM dbo.Company AS C WITH(NOLOCK)
WHERE
C.col_1 LIKE 'something%'
OR C.col_1 LIKE 'something2%'
OR C.col_1 LIKE 'something3%'
OR C.col_2 LIKE 'something%'
OR C.col_2 LIKE 'something2%'
OR C.col_2 LIKE 'something3%'
我尝试更快地进行查询,并尝试在col_1和col_2上添加索引。如果我注释掉有关col_2的条件,则查询是超快的,对于col_1是相同的(如果我注释掉col_1的条件)。但是,当我这样离开它时,它的故事很古老,很慢。
我怀疑从执行计划来看,一次只使用一个索引,SQL在使用第一个索引后执行子集扫描。我尝试了不同的东西(制作两列的索引,但也不起作用)
实际上我唯一的解决方案是拆分查询并使用UNION。有没有办法让这种查询更快并将其保存在一个查询中?
答案 0 :(得分:2)
使用联盟。那就是:
SELECT TOP 1000 C.iId_company
FROM dbo.Company AS C WITH(NOLOCK)
WHERE
C.col_1 LIKE 'something%'
OR C.col_1 LIKE 'something2%'
OR C.col_1 LIKE 'something3%'
union all
SELECT TOP 1000 C.iId_company
FROM dbo.Company AS C WITH(NOLOCK)
WHERE
C.col_2 LIKE 'something%'
OR C.col_2 LIKE 'something2%'
OR C.col_2 LIKE 'something3%'
根据需要进行调整(例如,您可能需要将整个事物包装在一个选择中,以便您可以添加order by子句以获得您认为的前1000名)。但我认为你会对这个解决方案感到满意。
答案 1 :(得分:0)
您的要求指出需要两个单独的索引,每个索引在您要搜索的每列上。使用您喜欢的任何DBA工具生成并查看查询的解释计划。现在,您可以开始重新处理查询,以查看解释计划是否比先前的尝试更好。您可能需要使用UNION或公用表表达式将两个查询组合到一个结果集中。