Sql 通过删除游标来提高性能

Sql 通过删除游标来提高性能,sql,sql-server,cursor,Sql,Sql Server,Cursor,这个脚本需要几个小时才能执行,是否有任何方法可以移除游标并仍然在主键responseId上迭代表 谢谢。当然。。。只需插入/选择 insert into MyOtherTable SELECT responseId, anotherField, 'static text' FROM ResponseTable -- add where clause as needed 很可能问题不在于光标,而在于插入逻辑是什么。您应该验证您的机器上是否有足够的内存来执行此循环,并且表上是否有索引 一些地方可以

这个脚本需要几个小时才能执行,是否有任何方法可以移除游标并仍然在主键responseId上迭代表


谢谢。

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

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

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

一些地方可以开始:

运行游标执行的select语句需要多长时间? 执行插入逻辑的单个迭代需要多长时间? 您是在执行“插入到”还是“插入选择”?检查select运行所需的时间,并检查该查询的索引。
实际上,在insert逻辑中有许多select语句

所以我删除了游标,并使用联接插入了该表,该表有100列和近10万行,插入所有数据需要2分钟


使用游标需要18个小时,因此使用join的速度非常快。

使用函数,将select语句的行放入该函数的insert逻辑中,该函数返回结果表,并使用cross apply将函数与游标的select语句连接起来 选择mytable1.result FROM ResponseTable 交叉应用从functionResponseTable.responseId dd中选择* 其中dd.responseId=ResponseTable.responseId mytable1


其中mytable1.responseId=ResponseTable.responseId

这完全取决于插入逻辑是什么,你不同意吗?答案取决于游标环井内实现的逻辑类型,正如注释中所说的那样……它完全取决于插入逻辑是什么
insert into MyOtherTable
SELECT responseId, anotherField, 'static text'
FROM ResponseTable
-- add where clause as needed