当OR时,为什么SQL FullText查询会变慢?

And*_*ong 11 sql sql-server performance

在SQL Server(2008年),我有两列的全文索引,给他们打电话Table1.FirstNamesTable2.LastNames.在分析了一些查询之后,我想出了以下结果:

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(FirstNames, 'Bob') OR CONTAINS(LastNames, 'Bob')
Run Code Online (Sandbox Code Playgroud)

=> 31 197ms

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE (FirstNames LIKE '%Bob%') OR CONTAINS(LastNames, 'Bob')
Run Code Online (Sandbox Code Playgroud)

=> 1941ms

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(FirstNames, 'Bob') OR LastNames LIKE '%Bob%'
Run Code Online (Sandbox Code Playgroud)

=> 3201ms

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(FirstNames, 'Bob')
Run Code Online (Sandbox Code Playgroud)

=> 565ms

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE FirstNames LIKE '%Bob%'
Run Code Online (Sandbox Code Playgroud)

=> 670毫秒

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(LastNames, 'Bob')
Run Code Online (Sandbox Code Playgroud)

=> 17ms

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE LastNames LIKE '%Bob%'
Run Code Online (Sandbox Code Playgroud)

=> 3ms

即使我重建FullText索引,此行为仍然存在.

对于特定语言的大型数据集,FullText通常比LIKE查询快得多,但为什么当我将两个FullText clasues合并在一起时,查询速度会减慢一个数量级?

Mar*_*ith 5

是否改为使用ContainsTable帮助?

它在这里做了添加更多OR搜索与CONTAINS带来查询到抓取

而同样的回答者(乔·斯特凡内利)管理的改变带来了类似的改进FREETEXT谓词联合ORFREETEXTTABLE 这里跨多个表的SQL Server全文查询-为什么这么慢?

  • 如果接受这个答案,我会获得声望点吗?:-) (3认同)