Сравните NULL-параметры со столбцами, которые могут содержать значения NULL - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь работать на SQL Server с некоторыми параметрами, которые могут иметь значение NULL, где NULL означает «игнорировать этот параметр».

Тогда у меня есть столбец, в котором хранится отчество и может содержать нули.

У меня есть следующие условия, которые работают очень быстро:

T.tr_ben_name           =   ISNULL(@BenFirstName,       T.tr_send_name)     AND
T.tr_ben_middle         =   ISNULL(@BenMiddleName,      T.tr_send_middle)   AND
T.tr_ben_last           =   ISNULL(@BenLastName,        T.tr_send_last)     AND
T.tr_ben_last2          =   ISNULL(@BenSecondLastName,  T.tr_send_last2 )

Но по какой-то причине, если значение отчества и соответствующий параметр равны NULL, запись будет пропущена, даже еслиЯ отключаю ANSI NULLS.

Затем я предложил другую версию, которая работает хорошо, но в 4 раза медленнее:

(T.tr_ben_name          =   @BenFirstName       OR  @BenFirstName       IS NULL)    AND
(T.tr_ben_middle        =   @BenMiddleName      OR  @BenMiddleName      IS NULL)    AND
(T.tr_ben_last          =   @BenLastName        OR  @BenLastName        IS NULL)    AND
(T.tr_ben_last2         =   @BenSecondLastName  OR  @BenSecondLastName  IS NULL)    

Может кто-нибудь объяснить, в чем разница между этими двумя подходами?

1 Ответ

0 голосов
/ 24 сентября 2018

Это краткое описание того, почему запросы выполняются по-разному, и что вы можете сделать, чтобы повысить производительность.Для получения дополнительной информации см. Catch-All Queries и Revisiting Catch-all Queries от Gail Shaw.Для подробного анализа см. Условия динамического поиска в T ‑ SQL . Автор Erland Sommarskog.

По сути, запрос с условными параметрами пытается создать план запроса, который работает для всех возможных комбинаций параметров.передается внутрь. Это означает, что поиск по индексу не выполняется по умолчанию, если вы передаете только параметры поиска.Вместо этого он использует план запроса, который можно использовать для любой комбинации параметров.

Основные исправления для этой проблемы:

  1. Добавление OPTION (RECOMPILE) в конце вашего запроса (SQL 2008R2 SP1, 2008 SP3 или выше)
  2. Использовать динамический SQL.Добавляйте только проверяемые условия с ненулевыми параметрами.

Если вам нужны подробные сведения о причинах и причинах, статьи выше очень хороши.

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