【问题标题】:Query porformance vs performance of the same query in cursor查询性能与游标中相同查询的性能
【发布时间】:2017-08-07 05:47:42
【问题描述】:

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

非常感谢您的帮助!

【问题讨论】:

  • 您使用的是哪个 dbms?此类问题几乎总是针对特定产品的。
  • 我使用 Microsoft SQL Server Management Studio 2012 :)

标签: sql sql-server stored-procedures cursor


【解决方案1】:

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

现在,您将 SELECT 与一个存储过程进行比较,该存储过程为该 SELECT 中的一个或多个行执行 INSERT。期望他们有相似的时间是幼稚的,充其量是。您正在比较 reads 和 writes。想想:读取来自缓存,写入到磁盘。

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

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

【讨论】:

    【解决方案2】:

    我假设,表上的插入操作和您一遍又一遍地调用的查询以及依赖于表的给定状态(插入时索引更改!)的游标相互阻塞。

    整个方法闻起来......

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

    一见钟情the MERGE statement might be perfect for you...

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

    更新

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

    【讨论】:

    • INSERT 和 cursor 不可能互相阻止。根据定义,这将是一个自死锁。
    • @RemusRusanu 那么在CURSOR 中 的附加查询呢?据我了解,OP会轮流查询数据以检查是否要操作...
    • 没关系,任何类型的数据操作或查询都会从 same 连接发生。如果发生阻塞,就是自死锁。
    • @RemusRusanu 好的,这实际上很明显 :-) 感谢您的洞察力!
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 2010-12-19
    • 2020-08-03
    • 1970-01-01
    • 2023-03-13
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多