在临时表上创建游标 - 安全吗?

Tes*_*ati 1 sql temp-tables cursor

我知道在 SQL 中创建和使用游标既不安全也不高效,但有时它是唯一的选择。现在这是我唯一的选择。

我的问题不是如何避免使用游标,而是如果游标仅在存储过程中动态创建的临时表上运行,那么安全性如何以及会引发哪些性能问题。我知道游标的运行速度比设置操作慢,并且会在它们正在迭代的表上加锁。我的临时表是一个相对较小的表,仅包含一个 int 类型的字段和最多 50 条记录。

DECLARE @pD int

DECLARE CurDB CURSOR FOR            
SELECT pD FROM #mD
open CurDB
fetch next from CurDB into @pD
etc...
Run Code Online (Sandbox Code Playgroud)

jea*_*ean 5

是的,它很安全!和不!游标通常不会在其迭代的表上加锁。另外,为了获得更好的性能,大多数时候您可以使用 FAST_FORWARD 声明游标(如果它们不更新正在迭代的表)。

您可以查看有关DECLARE CURSOR的文档

另外,99.9% 的情况下,您可以使用关系逻辑编写一个漂亮的查询来完成游标可以完成的相同工作,但通常更快并且使用更少的内存。

事实上,游标不仅笨拙,而且在使用内存方面表现不佳,临时表也会消耗 RAM(或 tempdb,可能两者都)。

性能不仅与时间和 CPU 周期有关,还与资源有关!