【问题标题】:Troubleshooting SQL Server Strange TimeoutSQL Server 异常超时疑难解答
【发布时间】:2016-05-03 00:08:40
【问题描述】:

我有一个相当通用的选择查询。当我选择特定结果集的前 1245 个结果时,它会在一秒钟内运行,正如预期的那样。但是,如果我为 1246 运行它,它会像无限循环一样连续运行。我检查了第 1245 行和第 1246 行的格式,这些数据看起来完全正常。我还可以对超过 2300 的单独用户组运行相同的查询,同样,它几乎立即运行,这让我认为这与内存问题无关。

作为查询格式的快速示例:

SELECT TOP 1246 a.id, 
(SELECT TOP 1 col_1 FROM table_1 t INNER JOIN table_2 c ON t.id=c.id WHERE t.id=a.id) AS [columnAlias]
FROM table_3 a

欢迎任何关于故障排除的想法。

如果我能提供任何其他可能有帮助的信息,请尽管询问。

【问题讨论】:

  • 发布查询计划可能会提供一些见解。此外,使用 TOP 1 而不使用 ORDER BY 没有多大意义。在性能方面,对列使用相关子查询通常也是一个坏主意。您应该能够使用普通的JOINs 轻松执行所有这些逻辑。
  • 这种方法的问题是,如果你修复了这个性能问题然后重构它,那么 SQL Server 可能会选择一个新的查询计划,现在你已经做了很多工作来纠正一个性能问题对于从未真正使用过的代码 - 因为现在你有了新代码。
  • 是的,好点。我现在将重新考虑它,看看它是否会影响上一期。如果是这样,我会为它提出一个新问题,因为这个问题将不再相关。感谢您的意见。

标签: sql sql-server timeout


【解决方案1】:

性能上的差异可能是由于执行计划的变化。您可能需要检查统计信息是否是最新的。

其次,您的查询确实没有意义,因为子查询与外部查询没有关系。因此,您不妨接受将获得一个值并将其移至from 子句:

SELECT TOP 1246 a.id, col_1 AS [columnAlias]
FROM table_3 a CROSS JOIN
     (SELECT TOP 1 col_1 FROM table_1 t INNER JOIN table_2 c ON t.id=c.id);

最后,如果您对查询有其他意图,您应该问另一个问题。如果您修改您的问题,您可能会使该答案无效,从而导致投票失败。

【讨论】:

  • 感谢 Gordon,我曾尝试检查两个查询的执行计划,但它们是相同的。编辑:另外,就查询而言,我试图尽可能地降低结构,但可能已经过火到删除一些相关部分的地步。我将编辑原始内容以在子查询中添加额外的 where 条件。
【解决方案2】:

当您到达特定记录时,“在无限循环上连续运行”让我怀疑您遇到了死锁情况。您发布的内容中没有任何明显的原因会导致它,所以我怀疑有一个正在运行的上下文,例如这是一个多步骤交易的一部分,这可能是原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多