特定查询直接运行良好,或者在对其进行任何更改但在当前状态下需要更长的时间才能运行
Posted
技术标签:
【中文标题】特定查询直接运行良好,或者在对其进行任何更改但在当前状态下需要更长的时间才能运行【英文标题】:Specific Query runs fine directly or when any change to it is made but in current state takes longer to run 【发布时间】:2011-01-25 16:07:57 【问题描述】:调试几天后的重大更新:
我运行了一些类似的查询:
SELECT RTRIM(part) as part
FROM tableP pm
LEFT join tableS s on pm.id = s.id
INNER JOIN tableC cm ON cm.id = pm.id
WHERE name = 'NGW' AND status NOT IN ('NL', 'Z')
GROUP BY RTRIM(part), isnull(s.value,0)
ORDER BY isnull(s.value,0)
它在 Java 中运行如下:
PreparedStatement select = con.prepareStatement(
"SELECT RTRIM(part) as part" +
"FROM tableP pm " +
"LEFT JOIN tableS s ON pm.id= s.id " +
"INNER JOIN tableC cm ON cm.id= pm.id " +
"WHERE name =? AND status NOT IN ('NL', 'Z') " +
"GROUP BY RTRIM(part), isnull(s.value,0) " +
"ORDER BY isnull(s.value,0) " );
select.setString(1, name);
ResultSet rs = select.executeQuery();
while(rs.next())
... Data is Loaded...
查询在 Java 应用程序中运行良好。突然,这种表单的 3 或 4 次查询从不到一秒变为一分钟多。
我已经从 SQL Profiler 复制了确切的查询,当直接在数据库上运行时,它会在不到一秒的时间内完成。我开始对查询进行更改,发现对查询的任何更改都会使其恢复到 1 秒的性能即使在语句之间添加一个空格。但是一旦我将它恢复到原来的确切状态,就需要 60 多秒。
核心问题: 所以,我有一个修复,但是即使只是像空格一样小的更改,什么可能导致查询运行不同?
【问题讨论】:
请给出更精确的查询,带有过滤器和参数。来自 Java 和 MSSQL EM。 @gbn,更新了问题以包含确切的查询(更改名称以保护无辜者)和调用它的 Java 代码。 谢谢。这消除了我本来要回答的内容......对不起! 更新了问题,因为我已经解决了这个问题。 【参考方案1】:执行计划是否可能已损坏?您可以尝试显式清除计划缓存吗? http://msdn.microsoft.com/en-us/library/aa175244(v=sql.80).aspx
【讨论】:
这听起来合乎逻辑,我正在阅读您的链接并将尝试一下。 效果很好。具体来说,我在一个表上使用了sp_recompile
,该表在所有 3 个查询中都运行良好。以上是关于特定查询直接运行良好,或者在对其进行任何更改但在当前状态下需要更长的时间才能运行的主要内容,如果未能解决你的问题,请参考以下文章
UIActionSheet 在 iOS6 中运行良好,但在 iOS7 中崩溃——数据结构有问题