在存储过程中需要临时表的情况

时间:2011-07-11 06:17:11

标签: sql sql-server-2008

有人能解释我们需要在存储过程中使用临时表的情况吗?

1 个答案:

答案 0 :(得分:1)

在许多情况下,复杂的连接可以真正使优化器绊倒,并使其成为非常昂贵的东西。有时,降低优化器的最简单方法是将复杂查询分解为更小的部分。你会发现很多关于使用@table变量而不是#temp表的错误信息,因为@table变量总是存在于内存中 - 这是一个神话,不相信它。

如果您有一个离群查询真的可以从不在基表上的不同索引中受益,并且您不允许(或者可能是有害的)将该索引添加到基础中,您也可能会发现这是有价值的table(例如,它可能是备用聚簇索引)。解决这个问题的方法是将数据放在#temp表中(它可能是基表的有限子集,就像过滤索引一样),在#temp表上创建备用索引,然后运行连接反对#temp表。如果过滤到#temp表中的数据将被多次使用,则尤其如此。

有时您需要针对某些数据进行许多更新,但您不希望多次更新基表。对于在一个查询中无法完成的各种其他数据,您可能需要执行多项操作。将受影响的数据放入#temp表,执行一系列计算/修改,然后更新回基表一次而不是n次可能更有效。如果您在此处使用针对基表的事务,则可以将其与用户长时间锁定。

另一个例子是,如果您使用链接服务器,并且跨服务器的连接结果非常昂贵。相反,您可以先将远程数据填充到本地#temp表中,在本地创建索引,然后在本地运行查询。