sql - 无限期执行 select 语句的存储过程

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

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

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

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

由于项目保密,我不能在这里贴出存储过程。存储过程卡在这个 select 语句处。即使在运行存储过程 24 小时后,它也没有完成执行。

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

我无法理解黑白两种方法的区别;为什么存储过程使用表变量无限期地执行?

最佳答案

表变量有点棘手,因为

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

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

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

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

关于sql - 无限期执行 select 语句的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25618754/

相关文章:

sql - PostgreSQL 中 LISTAGG(Oracle 数据库)的等价物是什么?

c# - C#中恢复数据库的问题

sql-server-2008 - 我的语法有什么问题?

c# - SSIS For Each循环中的脚本任务-写入文件

java - sql - 创建单个查询以获取给定条件的值

sql - SELECT MAX(col_name) 和 ROWNUM = 1 之间的性能

sql - 分割字符串并获取最后一个元素

sql-server - 如何检查表是否存在并且在一个 IF 中不为空

sql - SSMS 2008 插件 - 执行查询

asp.net-mvc - SaveChanges() 不保存数据