1

我知道基于集合的解决方案是理想的,并且通常优于游标。所以,请。通过放弃“不要使用光标,使用基于集合的操作”的答案来节省您和我的时间。我问这个是因为我的谷歌搜索没有给出任何答案,并且知识可能来自经验:

1) FETCH NEXT FROM 与 FETCH FROM当我打开游标(fast_forward/static)时,在 while 循环中使用 'fetch next from' 和 'fetch next' 有区别吗?在性能方面,访问记录的顺序等。

2) ROW_NUMBER + SELECT/WHILE vs STATIC CURSOR据我了解,静态游标创建一个带有所选数据的临时表并遍历该临时表。那么,是否有任何理由使用select row_number() ..., ... from ... into ...索引变量和迭代它select * from #tmp table where RowNumber = @IndexVar

3) FAST_FORWARD - 它可以分解吗?如果我有一个 fast_forward 本地游标,并且在此游标内插入/更新操作是在游标从中选择的表上执行的,有什么问题吗?(可能的周期等?)

4) PLAN FORCING有没有办法强制fast_forward 游标使用静态/动态计划?

非常感谢您的回答

PS:对于那些真正好奇的人,是的,可以将问题重写为基于集合的方法,但是由于上级的一些决定,必须使用存储过程创建/插入在主表中创建的新行.

4

2 回答 2

0
  1. NEXT是默认提取选项,所以FETCH=FETCH NEXT
  2. 静态/动态是指是否反映游标结果集所做的更改,即如果您将新值插入到静态游标结果集中,它不会循环遍历这些值,它是在声明/打开游标时存在的任何结果,就是这样,我相信你的理解是正确的。
  3. 我不确定。
  4. 我不确定您在这里的意思,您可以在声明光标时指示动态或静态。
于 2013-07-09T21:43:22.930 回答
0

在while循环中使用'fetch next from'和'fetch next'有区别吗

否 -NEXT如果未指定选项,则为默认值

那么,是否有任何理由使用select row_number() ..., ... from ... into ...索引变量和迭代它select * from #tmp table where RowNumber = @IndexVar

我认为静态游标的优化比创建临时表并在每次迭代中搜索特定行的速度更快,但我必须尝试一下。

如果我有一个 fast_forward 本地游标,并且在此游标内插入/更新操作是在游标从中选择的表上执行的,有什么问题吗?(可能的周期等?)

我不确定您所说的“循环”是什么意思-如果基础数据更改,光标也会更改(除非您将其声明为STATIC

有没有办法强制 fast_forward 游标使用静态/动态计划?

我从未尝试过,但是您可以在定义光标时尝试使用OPTION( USE PLAN ...)in your 。SELECT我想不出它不起作用的原因。

我对此很生气,谷歌一无所知

谷歌只是报告人们在互联网上发布的内容......你为什么生气?你想解决什么问题?

于 2013-07-09T21:46:53.560 回答