SQL Server 临时表与游标
Posted
技术标签:
【中文标题】SQL Server 临时表与游标【英文标题】:SQL server temporary tables vs cursors 【发布时间】:2011-06-01 21:26:14 【问题描述】:在 SQL Server 存储过程中,何时使用临时表以及何时使用游标。哪个是最好的选择?
【问题讨论】:
如果你能帮上忙的话。 SQL 是基于 SET 的,通常可以处理最常使用临时表和/或游标的情况。 为什么不是 CTE? msdn.microsoft.com/en-us/library/ms175972.aspx 你能在这里澄清一下吗?使用临时表与使用游标有点像苹果和橘子。临时表与表变量将是更合适的比较。 如果我有一个运行一堆基于集合的操作的存储过程,并且我想在我的数据库中为 100 家不同的公司运行它。我认为可以将光标悬停在 100 上,或者使用临时表遍历 100。在这种情况下,两者之间有什么区别吗?我虽然游标在幕后使用了一个表变量,所以它不会有太大的区别。是吗? 【参考方案1】:如果可能的话避免像瘟疫一样的游标。 SQL Server 基于集合 - 您需要以 RBAR (row-by-agonizing-row) 方式执行的任何操作都会变得缓慢、迟缓并且违背 SQL 工作的基本原则。 p>
您的问题非常模糊 - 根据这些信息,我们无法真正说出您想要做什么。但主要建议仍然存在:只要有可能(并且在绝大多数情况下都是可能的),使用基于集合的操作- SELECT, UPDATE, INSERT
和连接——不要将你的程序思维强加到 SQL Server 上——这不是最好的方法。
因此,如果您可以使用基于集合的操作来填充和使用临时表,那么我每次都更喜欢这种方法而不是游标。
【讨论】:
【参考方案2】:游标逐行工作,表现极差。在几乎所有情况下,它们都可以被更好的基于集合的代码替换(但通常不是临时表)
临时表的好坏取决于数据量和您对它们的处理方式。它们通常不能替代光标。
建议您阅读以下内容: http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them
【讨论】:
【参考方案3】:我相信 SARAVAN 最初在游标和临时表之间进行了比较,因为很多时候您会遇到这样一种情况,即使用带有标识列和 @counter 变量的临时表可以用来滚动/导航数据集。就像光标中的一个。
根据我的经验,使用临时表(或表变量)方案可以帮助我在 95% 的时间内完成工作,并且比通常缓慢的光标更快。
【讨论】:
以上是关于SQL Server 临时表与游标的主要内容,如果未能解决你的问题,请参考以下文章