Будет ли использование короткого замыкания в предложении WHERE улучшать скорость - PullRequest
1 голос
/ 22 апреля 2020

Вариант использования : я собираюсь использовать SQL Сервер для извлечения значений из большой таблицы (более 1 000 000 строк), где в качестве критериев фильтрации может использоваться много разных столбцов, некоторые чаще используются, чем другие.

Вопросы

  1. Было бы быстрее использовать короткое замыкание в предложении WHERE, чтобы было меньше сравнений?

  2. Следует ли сначала отфильтровать наиболее часто используемые критерии, чтобы сделать еще меньше сравнений?

  3. Следует ли индексировать наиболее часто используемые критерии?

Пример

  • Нет короткого замыкания
SELECT value
FROM AssignmentTable
WHERE (criteriaOne = <criteriaOneValue> OR criteriaOne IS NULL)
  AND (criteriaTwo = <criteriaTwoValue> OR criteriaTwo IS NULL)
  AND (criteriaThree = <criteriaThreeValue> OR criteriaThree IS NULL)
  AND ... for all criteria (roughly 15)
  • С коротким замыканием
SELECT value
FROM AssignmentTable
WHERE 1 = 
    CASE
        WHEN (criteriaOne = <criteriaOneValue> OR criteriaOne IS NULL) THEN
            CASE
                WHEN (criteriaTwo = <criteriaTwoValue> OR criteriaTwo IS NULL) THEN
                    CASE
                        WHEN (criteriaThree = <criteriaThreeValue> OR criteriaThree IS NULL) THEN 1
                        ELSE 0
                    END
                ELSE 0
            END
        ELSE 0
    END

1 Ответ

1 голос
/ 22 апреля 2020

Шаблон для выполнения этого без динамич. c SQL в SQL Сервер должен использовать OPTION (RECOMPILE) для удаления ненужных предикатов до того, как оптимизатор запросов сгенерирует план запроса.

EG:

SELECT value
FROM AssignmentTable
WHERE (Column1 = @column1 OR @column1 IS NULL)
  AND (Column2 = @column2 OR @column2 IS NULL)
  AND (Column3 = @column3 OR @column3 IS NULL)
  AND ... for all criteria (roughly 15)
OPTION (RECOMPILE)

См. Класс c Dynami c Условия поиска в T- SQL для полного обсуждения альтернатив.

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