【发布时间】:2011-08-13 02:52:24
【问题描述】:
我有一个看起来像这样的查询
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。有没有办法让这种查询更快并保留在一个查询中?
【问题讨论】:
-
如果您尝试
OPTION (FORCESEEK)提示会怎样?那会做一个索引联合吗? -
@Martin 在这种情况下你不能只为两列创建索引吗?
-
@rsbarro。如果他们创建了一个复合索引
col1,col2或col2,col1,则只能分别为col_1 LIKE 'something%'或col_2 LIKE 'something%'寻找它。它仍然需要扫描整个索引以确定其他OR-ed 标准。 -
@Martin 我明白了。我猜如果将它们组合在一起,复合索引会有所帮助,对吧?
-
@rsbarro 我认为你是对的,使用 AND 会导致使用复合索引,因为查询将匹配索引的组成,然后通过它进行搜索。
标签: sql sql-server sql-server-2008 indexing