【问题标题】:Why do SQL FullText queries slow down when you OR?为什么当你 OR 时 SQL 全文查询会变慢?
【发布时间】:2010-07-01 23:17:35
【问题描述】:

在 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')

=> 31 197 毫秒

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

=> 1941 毫秒

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

=> 3201 毫秒

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(FirstNames, 'Bob')

=> 565 毫秒

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE FirstNames LIKE '%Bob%'

=> 670 毫秒

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(LastNames, 'Bob')

=> 17 毫秒

SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE LastNames LIKE '%Bob%'

=> 3 毫秒

即使我重建全文索引,这种行为仍然存在。

FullText 通常比使用特定语言对大量数据进行 LIKE 查询要快得多,但为什么当我将两个 FullText 子句 OR 在一起时查询速度会降低一个数量级?

【问题讨论】:

  • WHERE FirstNames Like '%Bob%' OR LastNames Like '%Bob%' 的效果如何?
  • 大约 2 秒(我正在与他合作)

标签: sql sql-server performance


【解决方案1】:

改用ContainsTable 有帮助吗?

这里是Adding more OR searches with CONTAINS Brings Query to Crawl

同样的回答者 (Joe Stefanelli) 通过将 FREETEXT 谓词与 OR 组合更改为 FREETEXTTABLE 此处为 SQL Server full text query across multiple tables - why so slow?,设法带来了类似的改进

【讨论】:

  • 如果这个答案被接受,我会得到信誉积分吗? :-)
【解决方案2】:

【讨论】:

    【解决方案3】:

    我会看看每一个的执行计划。我猜你会从中学到不少东西。

    Here is a decent link 将向您展示如何显示执行计划以及解释它的一些技巧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      相关资源
      最近更新 更多