2011-04-26 43 views
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%' 
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

如果您尝试“OPTION(FORCESEEK)'提示会怎么样?那么这是否会做索引工会? – 2011-04-26 15:02:14

+0

@Martin在这种情况下,你不可以在这两列上创建一个索引吗? – rsbarro 2011-04-26 15:06:35

+0

@rsbarro。如果他们创建了一个复合索引'col1,col2'或'col2,col1',那么它只能分别查找col_1 LIKE'%'或'col_2 LIKE'某些%''。它仍然需要扫描整个索引以确定其他“OR”标准。 – 2011-04-26 15:09:18

回答

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%' 

根据需要调整(例如,您可能需要来包装整个事情的选择,这样就可以通过子句添加一个为了得到什么,你认为是顶1000)。但我认为你会对这个解决方案感到满意。

+0

使用UNION ALL附加两个结果集可能会产生重复行,因此最终从此联合中选择的表达式可能需要发出SELECT DISTINCT,或者上面的查询可能会使用UNION并导致该级别的排序。 – 2011-04-26 16:20:10

+0

这就是我想要避免的。我已经能够生成该查询。 (在我的问题中的最后一行) – MaxiWheat 2011-04-26 17:46:08

+0

@Fred:你说得对。我认为从组合中获得前1000名的工作效率要稍高一些,而不是在联盟中做出独特的选择。 – 2011-04-26 18:06:22

0

您的要求指出需要两个单独的索引,每个索引都需要一个索引。使用您喜欢的任何DBA工具生成并查看查询的解释计划。现在,您可以开始重新查询查看解释计划是否看起来比以前的尝试更好。您可能需要使用UNION或公用表表达式将两个查询组合到一个结果集中。

相关问题