通过删除光标来提高性能

时间:2012-04-10 12:11:20

标签: sql sql-server cursor

这个脚本需要花费数小时才能执行,有没有办法删除光标并仍然遍历主键responseId上的表?

DECLARE ResponseCursor CURSOR
FOR
     SELECT responseId FROM ResponseTable

FETCH NEXT FROM ResponseCursor INTO @ResponseId

WHILE @@fetch_Status =0
BEGIN
    --Insert Logic 
    FETCH NEXT FROM ResponseCursor INTO @ResponseId
END

CLOSE ResponseCursor
DEALLOCATE ResponseCursor

感谢。

4 个答案:

答案 0 :(得分:1)

当然......只需插入/选择

insert into MyOtherTable
SELECT responseId, anotherField, 'static text'
FROM ResponseTable
-- add where clause as needed

答案 1 :(得分:1)

实际上插入逻辑中有很多select语句。

所以我删除了Cursor并使用连接插入表,该表有100列和近10万行,并且花了2分钟来插入所有数据。

使用游标需要18个小时,所以使用加速超快速。

答案 2 :(得分:0)

很可能问题不在于光​​标,而是你的插入逻辑。您应该验证您的计算机上是否有足够的内存来执行此循环,并且您在表上有索引。

有些地方要开始:

  1. 运行游标的select语句需要多长时间?
  2. 执行插入逻辑的单次迭代需要多长时间?
  3. 您正在进行插入或插入选择吗?检查select运行的时间,并检查该查询的索引。

答案 3 :(得分:0)

使用函数并将select语句的行放在插入逻辑中的那个返回结果表的函数中,并使用cross apply将函数与游标的select语句连接起来 选择mytable1.result FROM ResponseTable 交叉应用(select * from function(ResponseTable.responseId)dd 其中dd.responseId = ResponseTable.responseId)mytable1

其中mytable1.responseId = ResponseTable.responseId