特定查询可以直接运行,也可以在对其进行任何更改时运行,但在当前状态下运行时间较长

时间:2011-01-25 16:07:57

标签: java sql-server jdbc sql-server-2000

经过几天的调试后,

重大更新:

我运行了一些类似于:

的查询
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事件探查器中复制了确切的查询,并且当直接在数据库上运行时,它会在不到一秒的时间内执行。我开始对查询进行更改,发现查询的任何更改都会将其返回到1秒的性能甚至在语句之间添加单个空格。但是一旦我将它恢复到原来的确切状态,它将需要60多秒。

核心问题: 所以,我有一个修复,但是什么可能导致查询以不同的方式运行,即使只有像空白一样小的变化?

1 个答案:

答案 0 :(得分:1)

执行计划是否可能已损坏?你能尝试明确清除计划缓存吗? http://msdn.microsoft.com/en-us/library/aa175244(v=sql.80).aspx