sql-server - 如何强制SQL Server在WHERE子句之前处理CONTAINS子句?

标签 sql-server query-optimization

我有一个同时使用标准 WHERE 子句和全文索引 CONTAINS 子句的 SQL 查询。该查询是从代码动态构建的,包含数量可变的 WHERE 和 CONTAINS 子句。

为了使查询速度更快,在应用其余条件之前搜索全文索引非常重要。

但是,SQL Server选择在CONTAINS子句之前处理WHERE子句,这会导致表扫描,查询速度非常慢。

我可以使用两个查询和一个临时表来重写它。当我这样做时,查询的执行速度提高了 10 倍。但我不想在创建查询的代码中这样做,因为它太复杂了。

有没有办法强制 SQL Server 在执行其他操作之前先处理 CONTAINS?我无法强制执行计划(使用计划),因为查询是动态构建的并且变化很大。

注意:我在 SQL Server 2005 和 SQL Server 2008 上也遇到同样的问题。

最佳答案

您可以像这样向优化器表明您的意图

SELECT
   *
FROM
    (
    SELECT *
    FROM


    WHERE
       CONTAINS
    ) T1
WHERE
   (normal conditions)

但是,SQL 是声明性的:您说的是您想要什么,而不是说如何做。因此优化器可能决定忽略上面的嵌套。

您可以在应用经典 WHERE 子句之前强制具体化包含 CONTAINS 的派生表。我不保证性能。

SELECT
   *
FROM
    (
    SELECT TOP 2000000000
       *
    FROM
       ....
    WHERE
       CONTAINS
    ORDER BY
       SomeID
    ) T1
WHERE
   (normal conditions)

关于sql-server - 如何强制SQL Server在WHERE子句之前处理CONTAINS子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6440109/

相关文章:

sql - 如何重现 “Cannot drop database because it is currently in use” ?

sql - Azure SQL : Invalid Object Name using Powershell's "Invoke-sqlcmd" on Adventureworks

sql - 如何返回元素属性值

mysql - 如何加速大量节点的路径查找?

ruby-on-rails - 在哪里修补Rails ActiveRecord::find()以便首先检查内存中的集合?

sql - SELECT FOR XML AUTO 并返回数据类型

sql - 如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

mysql - 我应该如何使用 BETWEEN 和 GROUP BY 为查询建立索引?

mysql - 优化查询获取每个订阅者一天的总通话时长

mysql - 复合索引中的 OR 问题