我有一个巨大的存储过程,它将表中的数据收集到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
无限期地执行?
答案 0 :(得分:2)
表变量有点棘手,因为
这些"缺点"可能导致查询优化器误入歧途 - 看起来非常糟糕!假设一行可能导致效率非常低的执行计划,如果这些表变量中确实有更多的行。
如果您使用5行或10行 - 没有大问题 - 但在您的情况下,您使用了数万行,显着不同于一行。
所以在这种情况下,我总是建议使用"正确的"临时表而不是表变量。