SQL Server临时表与游标

26

在 SQL Server 存储过程中,何时使用临时表,何时使用游标。就性能而言,哪种选项最佳?


如果可以避免的话,不要使用临时表或游标。SQL是基于SET的,通常可以处理大多数需要使用临时表和/或游标的情况。 - OMG Ponies
1
为什么不使用CTE?http://msdn.microsoft.com/zh-cn/library/ms175972.aspx - Adrian Godong
1
你能再解释一下吗?使用临时表和使用游标有点像苹果和橙子。比较临时表和表变量会更合适。 - tcnolan
1
如果我有一个存储过程,其中运行了一堆基于集合的操作,并且我想在我的数据库中为100个不同的公司运行它。我认为可以通过游标遍历这100个公司,或使用临时表来迭代这100个公司。在这种情况下,两者之间有什么区别吗?我曾经认为游标在幕后使用表变量,因此不会有太大的区别。但是实际上呢? - Jens Frandsen
3个回答

28
如果可能的话,尽量避免使用游标。SQL Server是基于集合的,任何需要按行进行处理的操作都会变得缓慢、迟钝,并且违反SQL工作的基本原则。
您的问题非常模糊 - 基于那些信息,我们无法真正了解您想要做什么。但主要建议仍然是:尽可能地使用基于集合的操作 - SELECT、UPDATE、INSERT和JOIN - 不要将过程式思维强加于SQL Server上 - 那不是最好的方法。
因此,如果您可以使用基于集合的操作来填充和使用临时表,我会更喜欢这种方法而不是使用游标。

9
游标以逐行方式工作且性能极差。在几乎所有情况下,它们都可以用更好的基于集合的代码来替换(通常不使用临时表)。
临时表可以是好的或者坏的,这取决于数据量和您对其进行的操作。它们通常不能替代游标。
建议阅读此文档: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

1

我相信 SARAVAN 最初将游标和临时表进行比较,是因为很多时候你会面临这样一种情况:使用带有标识列和 @counter 变量的临时表可以像游标一样滚动/浏览数据集。

根据我的经验,使用临时表(或表变量)方案可以帮助我在95%的情况下完成工作,并且比通常缓慢的游标更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接