проблема производительности хранимой процедуры / udf против простого запроса с консоли sql mgmnt на сервере sql - PullRequest
0 голосов
/ 03 июня 2011

У меня есть запрос, который использует вложенные 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 записей он выполняется менее чем за 11 секунд, когда запрос запускается из студии управления SQL с применением всех параметров. Когда те же параметры передаются в udf, это занимает около 55 секунд. Я попытался поместить запрос в хранимый процесс вместо udf, но все равно те же 55 секунд. Похоже, что когда запрос запускается из консоли управления, он использует параллелизм для запроса, но не для функции или хранимого процесса.

На данный момент это не главная проблема, но я хотел бы добиться того же 11-секундного исполнения, если смогу. Кто-нибудь сталкивался с подобным сценарием раньше?

1 Ответ

1 голос
/ 03 июня 2011

отображать ваши «настройки» из хранимой процедуры и только из 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.

см .: Устранение проблемы тайм-аута ADO в VB6 и Почему SET ARITHABORT ON значительно ускоряет запрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...