【问题标题】:Bypassing TSQL CONTAINS filtering绕过 TSQL CONTAINS 过滤
【发布时间】:2013-12-01 13:30:38
【问题描述】:

如果未指定搜索文本,是否有绕过结果集全文过滤的最佳做法?我现在要做的是:

SELECT * FROM items
WHERE @search='all' OR CONTAINS(*,@search)

不过不知道有没有更优雅的方式呢?

【问题讨论】:

  • 你想在什么条件下搜索全部或包含(*,@search)。你有什么具体情况吗?
  • 我想要返回所有行的条件是用户没有指定任何搜索字符串。当指定 serch 字符串时 - 我希望结果集由 CONTAINS 过滤

标签: sql-server tsql full-text-search contains


【解决方案1】:

您的示例是编写查询的最优雅方式。但是,您应该真正查看执行计划,看看这是否是最性能的方法。

您可能需要考虑编写这样的查询,以确保 SQL Server 在不需要时不会评估 CONTAINS 运算符。

if (@search = 'all')
    SELECT * FROM items
else
    SELECT * FROM items
    WHERE CONTAINS(*,@search)

【讨论】:

  • 不是 mssql 查询优化器能够在定义明确的 TRUE OR 之后消除不必要的测试吗?
  • 为什么我不希望在@search 为“全部”的情况下单独选择,因为我在几个全文子查询的 JOIN 中有这部分。因此,如果我将它们全部拆分-将有太多可能的组合(N^2,对于 3 个连接的子查询,将提供 9 个执行分支)
  • OR 可能会短路,我只是建议您要格外安全。无论如何都要检查执行计划。
  • 我检查了执行计划,它清楚地表明当@search 是'all' - 计划中没有全文搜索(否则它在那里)
猜你喜欢
  • 2019-02-21
  • 1970-01-01
  • 2013-08-08
  • 2013-11-07
  • 2016-05-07
  • 2016-06-24
  • 2013-04-13
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多