查询性能与游标中相同查询的性能

Query porformance vs performance of the same query in cursor

我有一个查询,它使用子查询和连接。我检查了那个查询,它运行得很好(很快)。但是后来,我创建了游标,在其中放置了完全相同的查询,然后在过程中使用了该游标(不带参数)。在该过程中,我检查行,如果获取的行与前一行相同(我确定使用一个变量),如果某列中的记录相等,则省略该行,否则插入我的 table。这就是它所做的一切。该过程会一直运行...谁能告诉我为什么要花这么长时间?

非常感谢您的帮助!

我假设 table 上的插入操作和您反复调用的查询以及依赖于 table 给定状态的游标(索引更改在插入!)互相阻挡。

整个方法闻起来...

如果可以避免,请不要使用 CURSOR! SQL 是一种基于集合的语言,CURSORs 代表一个过程概念。有时 CURSOR 可能是正确的选择,但更多时候应该以不同的方式解决问题。

第一眼看到the MERGE statement might be perfect for you...

顺便说一句:请阅读 How to ask a good SQL question and How to create a MCVE

更新

一个想法可能是,使用临时 table 变量在暂存中收集所有需要的数据 table 并在最后一次性完成真正的插入。

您遇到了性能问题,因此您需要将其作为性能问题进行调查。请阅读 How to analyse SQL Server performance.

现在,您将 SELECT 与存储过程 进行比较,存储过程 对 SELECT 中的一行或多行执行 INSERT。充其量,期望它们的时间相似是天真的。您正在比较 readswrites。思考:读取来自缓存,写入到磁盘。

您没有 post 任何性能调查数据,所以我将使用我的神奇 8 球滚动,它告诉我您正在独立事务中发出每个 INSERT,因此等待提交刷新每个插入。你不能期望像这样每秒超过 100 次提交(行)。您需要批量提交。或者,如果在 SQL Server 2014 或更高版本上,请使用 delayed durability.

Shnugo 也给出了很好的建议,在可能的情况下(几乎)总是使用一组操作而不是游标更好。