SQL-запрос: логическая обработка - PullRequest
1 голос
/ 13 января 2012

Понятия не имею, правильный ли это форум или нет. Допустим, у меня есть следующее:

SELECT *
FROM MyTable m
WHERE ((A OR B) AND (C OR D))

Предположим, что A, B, C, D являются правильными логическими предложениями, каждое из которых должно оцениваться на уровне строки. Также допустим, что индексы отсутствуют.

Это логически эквивалентно:

SELECT *
FROM MyTable m
WHERE (A AND C)
   OR (A AND D)
   OR (B AND C)
   OR (B AND D)

Есть ли преимущество в производительности? Мы на MSSql-2008.

1 Ответ

1 голос
/ 13 января 2012

Насколько я понимаю, ваш первый случай более эффективен, потому что:

в этом пункте: ГДЕ ((А ИЛИ Б) И (С ИЛИ Д))

весь оператор терпит неудачу, если ни A, ни B не верны; Вторая часть утверждения, (C ИЛИ D) не оценивается. Даже если A ИЛИ B верны, нужно проверить только еще одну пару - C ИЛИ D. В худшем случае перед проверкой всего оператора проверяются четыре критерия (если A = False, B = False, C = Неверно, но D = True). В лучшем случае утверждение становится ложным после проверки только A и B. Если ни одно из них не является истиной, то все утверждение ложно.

Во втором случае каждый из четырех случаев должен ВСЕМ оцениваться, прежде чем можно будет оценить оператор в целом.

Вложение условий ИЛИ внутри И означает, что если первый случай не удастся, более подробно, здесь больше ничего интересного. Вы улучшаете вещи еще больше, если вы ставите случай, скорее всего, как ложный, в качестве первой пары.

Мне будет интересно услышать от других об этом. , .

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