SQL Server, большая производительность процедуры - PullRequest
1 голос
/ 10 ноября 2011

У меня есть хранимая процедура с 1k строк и 16 не вложенными, если предложения.Каждый оператор if работает с набором из 4 переменных, например:

if @a is null and @b is null and @c is null and @d is null
if @a is null and @b is null and @c is null and @d is not null

и т. Д. (Следовательно, 4 ^ 2 = 16).Я написал процедуру следующим образом:

Во-первых, потому что она более читабельна, чем вложенные ifs (много работы над этой процедурой).Во-вторых, потому что каждый блок if получает очень простой код (выбор по первичному ключу или объединение по 3 или 4 первичным ключам).В-третьих, наличие переменной @a означает объединение всех, наличие переменной @b означает вычисление соединения и расстояния, наличие @c означает объединение, а наличие @d означает еще одно объединение.Как:

Теперь мне было интересно узнать о производительности, и я не уверен, как написать процедуру, чтобы получить лучшую производительность.Любые советы?

1 Ответ

1 голос
/ 10 ноября 2011

вам нужно прочитать Условия динамического поиска в T-SQL Эрланда Соммарского Есть много методов для поддержки запросов, которые используют многочисленные необязательные параметры фильтра. Хитрость в том, чтобы выбрать правильную стратегию, и делать тысячу IFs - не самое лучшее.

Если у вас правильная версия SQL Server 2008 (SQL 2008 с пакетом обновления 1 (SP1) CU5 (10.0.2746) и выше), вы можете использовать этот маленький трюк для фактического использования индекса: добавьте OPTION (RECOMPILE) к вашему запросу, см. Статья Эрланда , и SQL Server разрешит OR из (@OptionalParameter IS NULL OR YourColumn= @OptionalParameter ) до того, как план запроса будет создан на основе значений времени выполнения локальных переменных, и индекс может быть использован.

Это будет работать для любой версии SQL Server (возвращать правильные результаты), но включайте только OPTION (RECOMPILE), если вы используете SQL 2008 SP1 CU5 (10.0.2746) и более поздние версии. ОПЦИЯ (RECOMPILE) перекомпилирует ваш запрос, только перечисленная версия перекомпилирует его на основе текущих значений времени выполнения локальных переменных, что даст вам наилучшую производительность. Если не в этой версии SQL Server 2008, просто оставьте эту строку отключенной. Просто помните, что OR может убить использование индекса, но в правильной версии SQL Server 2008, OPTION(RECOMPILE) будет использовать индекс.

--sample procedure that uses optional search parameters
CREATE PROCEDURE YourProcedure
    @FirstName varchar(25) = null,
    @LastName varchar(25) = null,
    @Title varchar(25) = null
AS
    BEGIN
        SELECT ID, FirstName, LastName, Title
        FROM tblUsers
        WHERE
            (@FirstName IS NULL OR (FirstName = @FirstName))
            AND (@LastNameIS NULL OR (LastName= @LastName))
            AND (@TitleIS NULL OR (Title= @Title))
        OPTION (RECOMPILE) ---<<<<use if on for SQL 2008 SP1 CU5 (10.0.2746) and later
    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...