通过删除光标提高性能
问题描述:
该脚本需要数小时才能执行,是否有任何方法可以删除光标并仍然遍历主键上的表格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
谢谢。
答
实际上在插入逻辑中有很多选择语句。
所以我删除光标,并使用连接插入该表有100列和近1万行,并花了2分钟插入所有数据。
用游标花费了18个小时,所以使用它的超级快速加入。
答
当然......只是不插入/选择
insert into MyOtherTable
SELECT responseId, anotherField, 'static text'
FROM ResponseTable
-- add where clause as needed
答
机会是很好的,这个问题是不是光标,这是无论你插入逻辑。你应该验证你的机器上有足够的内存来完成这个循环,并且你在表上有一个索引。
有些地方开始:
- 多久需要运行select语句光标呢?
- 需要多长时间来执行一次插入逻辑的迭代?
- 你正在做一个插入或插入选择?检查select运行多长时间,并检查该查询的索引。
答
使用功能,并把你的SELECT语句中插入逻辑在该函数返回结果的表行,并使用交叉应用与光标 SELECT mytable1.result的select语句FROM ResponseTable 交叉加入功能申请(SELECT * FROM功能(ResponseTable.responseId)DD 其中dd.responseId = ResponseTable.responseId)MYTABLE1
其中mytable1.responseId = ResponseTable.responseId
它,而取决于究竟** **是什么'插入逻辑',你不同意吗? – AakashM 2012-04-10 12:12:42
Tha答案取决于在游标循环 – 2012-04-10 12:12:58
内部实现了什么样的逻辑,正如它在评论中所说的那样......它完全取决于“插入逻辑”是什么 – Lamak 2012-04-10 12:14:48