Эффективность хранимой процедуры - нулевые входные параметры и предложения Where - PullRequest
1 голос
/ 19 января 2011

Мне нравится минимизировать количество хранимых процедур, которые у меня есть, имея набор входных параметров со всеми значениями по умолчанию NULL и затем теми же параметрами, включенными в WHERE с тестом на равенство или NULL.

Насколько это неэффективно по отношению к производительности запросов - стихи пишут хранимую процедуру для 1 конкретной задачи? например Выбрать только по идентификатору пользователя, выбрать по имени пользователя / паролю, выбрать по имени / фамилии ...

Пример:

CREATE PROC dbo.up_Select_User

  @UserId int = NULL
, @Username varchar(255) = NULL
, @Password varchar(255) = NULL
, @FirstName varchar(50) = NULL
, @LastName varchar(50) = NULL
, @IsActive bit = NULL


SELECT UserId, Username, FirstName, LastName, EmailAddress
FROM dbo.[User]
WHERE (UserId = @UserId OR @UserId IS NULL)
AND (Username = @Username OR @Username IS NULL)
AND (Password = @Password OR @Password IS NULL)
AND (FirstName = @FirstName OR @FirstName IS NULL)
AND (LastName = @LastName OR @LastName IS NULL)
AND (IsActive = @IsActive OR @IsActive IS NULL)

Некоторая дополнительная информация - может быть неактуальной ... Я использую Entity Framework 4 для отображения на хранимые процедуры, используя смесь обычных сущностей и сложных типов в зависимости от результатов запроса.

Ответы [ 3 ]

7 голосов
/ 19 января 2011

Это неэффективно, потому что он использует ИЛИ и оптимизатор по умолчанию будет сканировать.

Если у вас есть несколько 1000 строк, все будет хорошо.

Иногда , этот шаблон работает лучше, потому что ISNULL может стать тривиальным

SELECT UserId, Username, FirstName, LastName, EmailAddress
FROM dbo.[User]
WHERE
    UserId = ISNULL(@UserId, UserId) AND
    Username = ISNULL(@Username , Username) AND 
    Password = ISNULL(@Password , Password ) ...
1 голос
/ 19 января 2011

мы используем этот способ для фильтрации

AND (CASE @UserId WHEN NULL THEN @UserId ELSE UserId END) = @UserId

У нас нет проблем с производительностью больших данных на SqlServer с решением.
Некоторые представления приложения (например, страницы обзоров отчетов) имеют более 20 настроек фильтра, и это хорошо работает с конструкцией CASE WHEN.

Edit: Эти параметры SET должны быть установлены

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
0 голосов
/ 22 ноября 2013

@ gbn: Осторожно, версия с ISNULL не совсем совпадает.Например, если параметр @FirstName имеет значение NULL

... AND (FirstName = @FirstName OR @FirstName IS NULL)

, он не заботится о значениях FirstName;результат включает записи, в которых FirstName равен NULL

, а

... AND FirstName = ISNULL(@FirstName, FirstName)

результат НЕ включает записи, в которых FirstName равен NULL

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