【问题标题】:performance issue on stored procedure/udf vs plain query from sql mgmnt console in sql server存储过程/udf 与来自 sql server 中 sql mgmnt 控制台的普通查询的性能问题
【发布时间】:2011-06-03 14:01:48
【问题描述】:

我有一个使用嵌套 CTE 的查询,它位于用户定义的函数中。我必须使用嵌套 CTE,因为我想重用之前选择的一些计算/案例语句。该查询类似于以下内容。

;with cte1 as 
(
   select a, b from Table1
),

ct2 as
(
   case when a =1 then 1 else 0 end as c, b from cte2
)
select * from cte2

我在从多个存储过程调用的 udf 中有这个。在这个查询中进行了大量的计算。当查询在函数之外运行时,我注意到性能差异。对于大约 12,000 条记录,当从 SQL 管理工作室运行查询并应用所有参数时,它的运行时间不到 11 秒。当向 udf 提供相同的参数时,大约需要 55 秒。我试图将查询放在存储过程中而不是 udf 中,但仍然是 55 秒。看起来当从管理控制台运行查询时,它对查询使用并行性,但对函数或存储过程不使用。

目前这不是一个主要问题,但如果可以的话,我想达到同样的 11 秒性能。有没有人遇到过类似的情况?

【问题讨论】:

    标签: sql-server sql-server-2005


    【解决方案1】:

    从存储过程中和仅使用 SSMS 显示您的“设置”。我也有同样的东西,SSMS 更快,程序更慢。您有时可以解决此问题,因为 SSMS 使用与程序不同的设置运行,使它们相同,您可能能够在程序中看到相同的性能。下面是一些显示设置的示例代码:

    SELECT SESSIONPROPERTY ('ANSI_NULLS') --Specifies whether the SQL-92 compliant behavior of equals (=) and not equal to (<>) against null values is applied.
                                          --1 = ON 
                                          --0 = OFF
    
    SELECT SESSIONPROPERTY ('ANSI_PADDING') --Controls the way the column stores values shorter than the defined size of the column, and the way the column stores values that have trailing blanks in character and binary data.
                                            --1 = ON 
                                            --0 = OFF
    
    SELECT SESSIONPROPERTY ('ANSI_WARNINGS') --Specifies whether the SQL-92 standard behavior of raising error messages or warnings for certain conditions, including divide-by-zero and arithmetic overflow, is applied.
                                             --1 = ON 
                                             --0 = OFF
    
    SELECT SESSIONPROPERTY ('ARITHABORT') -- Determines whether a query is ended when an overflow or a divide-by-zero error occurs during query execution.
                                          --1 = ON 
                                          --0 = OFF
    
    SELECT SESSIONPROPERTY ('CONCAT_NULL_YIELDS_NULL') --Controls whether concatenation results are treated as null or empty string values.
                                                        --1 = ON 
                                                        --0 = OFF
    
    SELECT SESSIONPROPERTY ('NUMERIC_ROUNDABORT') --Specifies whether error messages and warnings are generated when rounding in an expression causes a loss of precision.
                                                  --1 = ON 
                                                  --0 = OFF
    
    SELECT SESSIONPROPERTY ('QUOTED_IDENTIFIER') --Specifies whether SQL-92 rules about how to use quotation marks to delimit identifiers and literal strings are to be followed.
                                                 --1 = ON 
                                                 --0 = OFF
    

    您可以将它们添加到您的结果集中::

    SELECT
        col1, col2
            ,SESSIONPROPERTY ('ARITHABORT') AS ARITHABORT
            ,SESSIONPROPERTY ('ANSI_WARNINGS') AS ANSI_WARNINGS
            ,SESSIONPROPERTY ('...
        FROM ...
    

    如果您一次尝试一个,请先尝试ARITHABORT

    见:Resolving an ADO timeout issue in VB6Why would SET ARITHABORT ON dramatically speed up a query?

    【讨论】:

    • 看起来这些是 db 级别的设置,对于 SSMS 和存储的 proc 应该是相同的。无论如何,经过进一步研究,似乎 udf 是麻烦制造者。如果我将其转换为存储过程并使用 ArithAbort = OFF(奇怪,它应该是 ON),它似乎在 16 秒内运行。但是我必须使用一个函数,因为该逻辑正在从多个 procs 中使用。不知道还能尝试什么,但这是一个很好的建议。
    • 我会接受答案,因为 arithAbort 似乎确实有所作为。
    • @coder net,我会在几个程序中复制代码,然后再使用函数使其在任何地方都变慢
    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多