gpt4 book ai didi

sql - 在查询中使用过滤器和 CONTAINSTABLE 时执行计划不佳

转载 作者:行者123 更新时间:2023-12-04 21:20:27 26 4
gpt4 key购买 nike

我们有一个有趣的问题,我希望有人能帮助解释一下。在高层次上,问题如下:

以下查询快速执行(1 秒):

SELECT SA.*
FROM cg.SEARCHSERVER_ACTYS AS SA
JOIN CONTAINSTABLE(CG.SEARCHSERVER_ACTYS, NOTE, 'reports') AS T1 ON T1.[Key]=SA.UNIQUE_ID

但如果我们在查询中添加过滤器,则大约需要 2 分钟才能返回:
SELECT SA.*
FROM cg.SEARCHSERVER_ACTYS AS SA
JOIN CONTAINSTABLE(CG.SEARCHSERVER_ACTYS, NOTE, 'reports') AS T1 ON T1.[Key]=SA.UNIQUE_ID
WHERE SA.CHG_DATE>'19 Feb 2010'

查看两个查询的执行计划,我可以看到在第二种情况下,实际行数和估计行数之间存在巨大差异的两个地方是:

1) 对于 FulltextMatch 表值函数,其中估计约为 22,000 行,实际为 2900 万行(然后在连接前过滤到 1670 行)和
2)对于全文索引上的索引seek,其中估计为1行,实际为13000行

作为估计的结果,优化器选择使用嵌套循环连接(因为它假设行数很少),因此该计划效率低下。

我们可以通过 (a) 参数化查询并向查询添加 OPTION (OPTIMIZE FOR UNKNOWN) 或 (b) 强制使用 HASH JOIN 来解决此问题。在这两种情况下,查询都会在不到 1 秒的时间内返回,并且估计值看起来很合理。

我的问题真的是'为什么在表现不佳的情况下使用的估计如此不准确,可以做些什么来改进它们'?

此处使用的索引 View 上的索引的统计信息是最新的。

非常感谢任何帮助。

最佳答案

这里的问题原来是 SQL Server 的版本。该问题在 SQL Server 2008(无服务包)中出现,并通过升级到 SQL Server 2008 SP1(并添加 CU5)得到解决。由于我们没有在没有安装 CU5 的情况下进行测试,因此我无法确定该修复程序是随 SP1 还是 CU5 提供的。没关系,问题解决了。士气?使您的服务器保持最新。

关于sql - 在查询中使用过滤器和 CONTAINSTABLE 时执行计划不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2655673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com