【问题标题】:SQL Cursor w/Stored Procedure versus Query with UDF带有/存储过程的 SQL 游标与带有 UDF 的查询
【发布时间】:2010-10-06 12:01:35
【问题描述】:

我正在尝试优化我正在维护的存储过程,并且想知道是否有人可以让我了解以下选项的性能优势/劣势。对于我的解决方案,我基本上需要对存储在表中 IMAGE 列中的图像运行转换程序。转换过程位于外部 .EXE 文件中。以下是我的选择:

  1. 将目标表的结果拉到临时表中,然后使用游标遍历表中的每一行,并在 IMAGE 列上运行存储过程。存储过程调用 .EXE。

  2. 创建一个调用 .EXE 文件的 UDF,并运行类似于“从 TargetTable 中选择 UDFNAME(Image_Col)”的 SQL 查询。

我想我正在寻找的是创建光标会增加多少开销的想法,而不是作为一个集合来做?

一些附加信息:

  • 在这种情况下,集合的大小是最大的。 1000
  • 正如下面的答案所述,如果使用 UDF 作为一组完成,这是否意味着外部程序一次打开 1000 次?或者是否有针对此的优化?显然,在多处理器系统上,运行多个进程实例可能不是一件坏事,但 1000 个可能有点多。

【问题讨论】:

    标签: sql-server stored-procedures user-defined-functions cursors


    【解决方案1】:

    在这种情况下定义集合基数? 如果您有 100 行,这会一次打开应用程序 100 次吗?我会说测试,只是因为您可以从 UDF 调用扩展过程,我仍然会为此使用游标,因为在这种情况下 setbased 无关紧要,因为您没有直接操作表中的数据

    【讨论】:

      【解决方案2】:

      我做了一些测试和试验,当在 UDF 中完成时,它确实一次处理每一行 - SQL 服务器不会为 100 行中的每一行运行 100 个进程(我不认为它会)。

      但是,我仍然认为将其作为 UDF 而不是作为游标执行会更好,因为我的研究倾向于表明,必须将数据拉出游标中的额外开销会减慢速度。这可能不会产生太大的影响,但与先将所有数据提取到临时表中相比,它可能会节省时间。

      【讨论】:

        猜你喜欢
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        相关资源
        最近更新 更多