Sql server 使用位字段和全文搜索时查询速度非常慢

Sql server 使用位字段和全文搜索时查询速度非常慢,sql-server,Sql Server,我有一个奇怪的问题,如果我执行以下查询,Sql Server(2008和2016)需要大约35秒才能完成 SELECT DISTINCT F.FilterTitle, F.FilterSlug, F.FilterOrderList, F.FilterType FROM products p JOIN products_translations pt ON pt.ProductId = p.Id AND pt.Culture = 'it' JOIN facets F ON F.ProductId

我有一个奇怪的问题,如果我执行以下查询,Sql Server(2008和2016)需要大约35秒才能完成

SELECT DISTINCT F.FilterTitle, F.FilterSlug, F.FilterOrderList, F.FilterType

FROM products p
JOIN products_translations pt ON pt.ProductId = p.Id AND pt.Culture = 'it'
JOIN facets F ON F.ProductId = p.Id AND F.Culture = 'it' AND F.FilterType = 2
JOIN products_categories pc ON pc.productId = p.id
JOIN categories C ON pc.CategoryId = C.Id
JOIN categories_slugs cps ON cps.CategoryId = C.ParentCategoryId AND cps.Culture = 'it'
JOIN categories_slugs cs ON cs.CategoryId = C.Id AND cs.Culture = 'it'

WHERE cps.value = 'string1' AND cs.value = 'string2'
AND CONTAINS(pt.DescriptionForSearch, '"value*"', LANGUAGE 1040) --this is a full text
AND p.Visible = 1 AND p.Payments = 0 --both are bit fields

ORDER BY F.FilterType, F.FilterOrderList, F.FilterTitle;
如果我评论这句话

and p.Visible = 1 and p.Payments = 0
查询只需要两个ms。如果我删除行,同样需要

and contains(pt.DescriptionForSearch, '"value*"' , language 1040)
另一份声明保持不变。我还为两个位字段创建了两个索引,没有任何更改

有人能解释一下为什么会发生这种情况吗

更新


我忘记包括的两个执行计划。

您做过任何分析吗?如果是的话,你能和我们分享一下吗?
p
pt
只是表格?(也许还有其他类似于风景的东西?)没有魔杖。你看执行计划。顺便说一下,如果where子句中没有bit列,我想优化器会完全忽略products表,因为其他表包含相同的列。resultset不包含products中的任何列,并且包含DISTINCT-这使我怀疑逻辑。我还想,P中的绝大多数行都将visible设置为1,这导致了表扫描。但这都是猜测。你是对的,我忘了执行计划,对此表示抱歉。我试着分别或分组进行实验,但没有改变。你做过任何分析吗?如果是的话,你能和我们分享一下吗?
p
pt
只是表格?(也许还有其他类似于风景的东西?)没有魔杖。你看执行计划。顺便说一下,如果where子句中没有bit列,我想优化器会完全忽略products表,因为其他表包含相同的列。resultset不包含products中的任何列,并且包含DISTINCT-这使我怀疑逻辑。我还想,P中的绝大多数行都将visible设置为1,这导致了表扫描。但这都是猜测。你是对的,我忘了执行计划,对此表示抱歉。我试着分别或分组进行实验,但没有任何改变。