gpt4 book ai didi

sql-server - 慢速查询 ColdFusion、SQL Server、依赖于空格

转载 作者:行者123 更新时间:2023-12-03 00:13:55 25 4
gpt4 key购买 nike

我们遇到了问题,我们正在从 ColdFusion 9 调用 SQL Server 2005。我无法发布原始查询,但这不是问题的焦点,我已经发布了导致问题的相关组合。

我们有一个查询,它是以下示例查询的更复杂版本,其中 something 列是主键。 value 参数没有改变。由于一些我们无法理解的奇怪原因,这个查询运行了近 20 秒......

<cfquery result="q" datasource="dsn">
SELECT something
FROM somewhere
WHERE something = <cfqueryparam cfsqltype="cf_sql_integer" value="#value#"/>
</cfquery>

注意如果您突出显示上面源代码的最后一行,cfqueryparam 标记后面有一个空格。

下面的查询完全不同,我相信您可以亲眼看到,它需要 15 毫秒才能运行。

<cfquery result="q" datasource="dsn">
SELECT something
FROM somewhere
WHERE something = <cfqueryparam cfsqltype="cf_sql_integer" value="#value#"/>
</cfquery>

cfqueryparam 后面没有空格。但是,在末尾添加两个空格也会产生 15 毫秒。如果我们返回到最后的一个空格,我们会在大约 20 秒内再次得到结果。

我们检查了 Java 和 SQL Server 之间的数据库驱动程序日志,没有发现任何异常。这里可能发生什么?

<小时/>

编辑

我们在 SQL Server 上运行了分析,结果显示对于具有单个空格的查询,它使用与具有零个或多个空格的查询不同的缓存执行计划。 SQL Server 缓存查询的执行计划。它还使用完整的文字查询作为标识符。因此,当我们发送其他查询时,会使用不同的执行计划。

进一步

其中一个执行计划看起来像是在某个子选择上查找不正确的索引,目前尚不清楚为什么 SQL Server 决定使用此备用执行计划,也不清楚为什么其中一个索引似乎是错误的。

跟进

对于任何对可能导致错误执行计划的原因感兴趣的人,后续问题发布在此处:SQL Server 2005 cached an execution plan that could never work

最佳答案

这可能是 Railo forums 上突然出现的问题的症状。前几天(奇怪的巧合)。

首次运行慢速版本的查询时使用的参数值的性质有可能导致创建一个执行计划,该执行计划对于该特定值“方便”,但对于更典型的后续值,该计划不太理想。相反,当第一次运行第二个查询时,作为参数传递的值更典型地反射(reflect)了查询的调用方式,因此执行计划更适合大多数其他值。

我个人没有见过这种情况发生,但我已经读过很多次了。听起来确实像您所看到的那样。

如果可能,请通过明确的 SQL Server 缓存进行测试,然后使用导致编译“错误”计划的值重新运行查询,您应该会看到类似的行为。

这不是解决方案,但它会证明这可能是原因,并允许您解决不同值的计划差异的根本原因。

这个实验显然是基于知道第一次调用查询时的参数值是什么,这就是......如果您确实知道它们,那对您来说就是偶然的。

关于sql-server - 慢速查询 ColdFusion、SQL Server、依赖于空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14242079/

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