【问题标题】:Cursor in Stored Procedure Performance Issues存储过程性能问题中的光标
【发布时间】:2012-01-10 23:18:55
【问题描述】:

我发现在下面的 SQL 和动态 SQL 中使用了一个游标。 Profile 提出了相当多的执行计划,我认为它必须处理这个游标。这是 SQL 的错误选择吗?

SET @SelectStmtSubHeader = 'SELECT DISTINCT
        dbo.dsb_testID(sh.GPCustomerID) AScursor -- RIGHT HERE
         PONumber,
        sh.GPCustomerID,
        .....

【问题讨论】:

    标签: sql sql-server stored-procedures cursor


    【解决方案1】:

    这不是光标的例子。

    光标需要...

    DECLARE this_is_a_cursor CURSOR
    FOR
      SELECT
        stuff
      FROM
        a_query
    

    您显示的截断代码似乎使用标量函数来派生一个值,并将其作为单词cursor 的别名。但是拥有一个名为 cursor 的字段并不能使其成为游标。

    【讨论】:

    • +1 因为我发现它不是光标,哈哈。我回答了这个问题,你证明了这个问题没有实际意义:p
    【解决方案2】:

    如果集合逻辑中存在替代方案,则游标几乎总是一个需要避免的错误选择。

    SQL 基于集合逻辑。它们不应该像集合一样被迭代。

    SQL 优化器通常非常擅长寻找巧妙的方法来检索您的数据。光标是一种相对简单的工具。 ANSI SQL 确实需要它,所以它通常存在。

    这是一个来自 Sybase 的好例子

    Cursor Performance Example

    【讨论】:

    • 这样的绝对主义言论让我不寒而栗。 CURSOR 总是有性能开销,但在某些情况下开销小于替代方案。例如,尝试在 SQL 中运行总计。 仅仅因为它们经常被幼稚的程序员不恰当地使用,并不会使它们普遍不好。
    • 很公平。请注意,我提供的链接来自 Sybase。作为数据库的制造商,我想他们是一个很好的来源,他们基本上说如果你有替代使用它。话虽如此,我会编辑我的帖子;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多