2012-04-10 62 views
0

该脚本需要数小时才能执行,是否有任何方法可以删除光标并仍然遍历主键上的表格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 

谢谢。

+6

它,而取决于究竟** **是什么'插入逻辑',你不同意吗? – AakashM 2012-04-10 12:12:42

+0

Tha答案取决于在游标循环 – 2012-04-10 12:12:58

+0

内部实现了什么样的逻辑,正如它在评论中所说的那样......它完全取决于“插入逻辑”是什么 – Lamak 2012-04-10 12:14:48

回答

1

实际上在插入逻辑中有很多选择语句。

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

用游标花费了18个小时,所以使用它的超级快速加入。

1

当然......只是不插入/选择

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

机会是很好的,这个问题是不是光标,这是无论你插入逻辑。你应该验证你的机器上有足够的内存来完成这个循环,并且你在表上有一个索引。

有些地方开始:

  1. 多久需要运行select语句光标呢?
  2. 需要多长时间来执行一次插入逻辑的迭代?
  3. 你正在做一个插入或插入选择?检查select运行多长时间,并检查该查询的索引。
0

使用功能,并把你的SELECT语句中插入逻辑在该函数返回结果的表行,并使用交叉应用与光标 SELECT mytable1.result的select语句FROM ResponseTable 交叉加入功能申请(SELECT * FROM功能(ResponseTable.responseId)DD 其中dd.responseId = ResponseTable.responseId)MYTABLE1

其中mytable1.responseId = ResponseTable.responseId