我有一个同时使用标准 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/