游标在内部做什么?

Jac*_*ost 0 sql-server stored-procedures

我正在优化用游标编写的存储过程(DECLARE cur_name CURSOR ...

客户看到这个 SP 运行了一天多,所以我的经理分配给我。

搜索时,我使用表变量和 while 循环来迭代每条记录。

令我惊讶的是,两者之间的差异是巨大的。

有人告诉我,while 循环本质上是一个 CURSOR。

但是当我使用带有 WHILE LOOP 的表变量时,它运行得非常非常快。

现在,游标在内部做了什么?

Dav*_*ett 5

游标循环,但根据您选择的选项,它们对于数据库引擎来说可能更复杂。

TSQL 中有许多游标选项可以对性能产生重大影响,具体取决于SELECT为游标提供信息的选项(有关详细信息,请参阅TSQL 文档)。这些选项将更改所需的锁和其他资源,可能导致部分查询重新运行,等等。此外,您的内部循环可能会通过更新它读取的基表来影响游标的行为,这种方式使数据库引擎需要做更多的工作。

如果我们可以看到您正在谈论的两段代码,我们可以更具体。

通过在表变量中运行初始查询并循环遍历,您实际上是在模拟STATIC FAST_FORWARD READ_ONLY游标,这些选项消除了引擎可能不得不担心的大量复杂性。您的 mainSELECT绝对是一次性运行的,并且您的循环在与变量中的副本交互时不会与基础数据上的其他活动竞争。

当然,您可能还会发现两个循环中的某些内容(一个使用游标,一个不使用),如果它们的编写方式不完全相同,则它们的性能指标会有显着不同。