存储过程无限期地执行select语句

时间:2014-09-02 08:11:34

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

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

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

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

由于项目的机密性,我无法在此处发布存储过程。存储过程陷入此select语句。即使在运行存储过程24小时后,它也没有完成执行。

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

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

1 个答案:

答案 0 :(得分:2)

表变量有点棘手,因为

  1. 他们没有与他们相关的统计数据
  2. SQL Server查询优化器 - 由于缺少有关这些表变量的统计信息 - 始终假设它们仅包含一行
  3. 这些"缺点"可能导致查询优化器误入歧途 - 看起来非常糟糕!假设一行可能导致效率非常低的执行计划,如果这些表变量中确实有更多的行。

    如果您使用5行或10行 - 没有大问题 - 但在您的情况下,您使用了数万行,显着不同于一行。

    所以在这种情况下,我总是建议使用"正确的"临时表而不是表变量。