【问题标题】:Stored procedure executing select statement indefinitely存储过程无限期执行 select 语句
【发布时间】:2014-09-02 08:11:34
【问题描述】:

我有一个巨大的存储过程,它将表中的数据收集到 3 个临时表(表变量)中。

@table1: 50,000 records
@table2: 23,000 records
@table3: 15,000 records

准备好数据后,存储过程执行一个巨大的select语句(180行),将这些临时表和一些物理表中的数据转换为XML格式并返回给客户端。

由于项目的机密性,我不能在这里发布存储过程。存储过程卡在这个select 语句上。即使运行存储过程 24 小时后,它也没有完成执行。

然后我用本地临时表 (#table1, #table2, #table3) 替换了所有表变量。令我惊讶的是,存储过程使用相同的数据成功执行。

我无法理解两种方法的区别;以及为什么使用table variables 无限期执行存储过程?

【问题讨论】:

标签: sql sql-server sql-server-2008 tsql stored-procedures


【解决方案1】:

表变量有点棘手,因为

  1. 他们没有与之相关的统计数据
  2. SQL Server 查询优化器 - 由于缺乏关于这些表变量的统计信息 - 始终假定它们仅包含 一行

这些“缺点”会导致查询优化器误入歧途——看起来很糟糕!如果这些表变量中的行数确实多得多,那么假设一行可能会导致执行计划效率非常低。

如果您使用 5 或 10 行 - 没什么大不了的 - 但在您的情况下,您使用的是数万行,这与一行显着不同。

所以在这种情况下,我总是建议使用“适当的”临时表而不是表变量。

【讨论】:

  • 实际上是错误的,因为您可以通过主键对表变量进行索引。 blogs.msdn.com/b/blogdoezequiel/archive/2012/12/01/… 还解释了假设的 1 行的问题以及如何解决它。并非一切都那么黯淡......
  • @TomTom:好的——你可以索引表变量。但是根据to this Kendra Little blog post,即使在 SQL Server 2014 中,表变量不支持统计数据 - 所以行估计将是 OFF 很长一段时间.....跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2019-06-23
相关资源
最近更新 更多