SQL Server'CONTAINS'比具有多个表达式的'LIKE'慢

时间:2015-05-06 18:31:57

标签: sql-server sql-server-2012

大约需要一分钟:

SELECT * 
FROM someBigTable 
WHERE someColumn LIKE '%foo bar%' 
OR someColumn LIKE '%hey macarena%'

这需要4-6分钟:

SELECT * 
FROM someBigTable 
WHERE CONTAINS(someColumn, '"foo bar" OR "hey macarena"')

我多次重复每个查询,以确保它不仅仅是一个侥幸。

someColumn已编入索引。

这种情况发生在一些表达式(比如“foo bar”和“hey macarena”)上,而不是其他表达式。但不应该''CONTAINS'总是比'LIKE'更快?在某些情况下,什么可能导致'CONTAINS'比'LIKE'慢?

(Windows Server 2012,SQL Server 2012)

修改

第一个查询的执行计划:

enter image description here

第二个查询的执行计划:

enter image description here

编辑2:“正常”案例的执行计划('CONTAINS'比'LIKE'快)

第一个查询的执行计划(~59秒):

enter image description here

第二个查询的执行计划(~4秒):

enter image description here

1 个答案:

答案 0 :(得分:1)

返回更多结果并不是调整查询的真实指示。它确实影响网络等,但不影响实际效率。更重要的是扫描多少数据来检索数据,使用哪些索引以及如何(ordered = true / false)。以及优化程序采取的其他操作。

在您的示例中,这两个过程并不相同。如果没有'*'指示符,则此处的Contain()将充当全文搜索,因此使用特定的全文索引。 类似'%%'只对包含where子句中的列的最小索引执行全表扫描,并且查找不在该索引中的列。

所以在这种情况下,它在很大程度上取决于索引的声明方式。