大约需要一分钟:
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)
修改:
第一个查询的执行计划:
第二个查询的执行计划:
编辑2:“正常”案例的执行计划('CONTAINS'比'LIKE'快)
第一个查询的执行计划(~59秒):
第二个查询的执行计划(~4秒):
答案 0 :(得分:1)
返回更多结果并不是调整查询的真实指示。它确实影响网络等,但不影响实际效率。更重要的是扫描多少数据来检索数据,使用哪些索引以及如何(ordered = true / false)。以及优化程序采取的其他操作。
在您的示例中,这两个过程并不相同。如果没有'*'指示符,则此处的Contain()将充当全文搜索,因此使用特定的全文索引。 类似'%%'只对包含where子句中的列的最小索引执行全表扫描,并且查找不在该索引中的列。
所以在这种情况下,它在很大程度上取决于索引的声明方式。