Порядок оценки в предложении WHERE и очень медленный запрос - PullRequest
1 голос
/ 27 января 2012
SELECT ... WHERE expr1 and expr2 or expr3 or expr4

этот запрос выполняется за> 3 минуты.

SELECT ... WHERE expr1 and (expr2 or expr3 or expr4)

мгновенно прекращается.

Я бы ожидал другие результаты , не отличающиеся производительность . Кто-нибудь может объяснить, почему?

Фон : выбранные левые внешние объединения 7 таблиц, но они не очень большие (<10 000 записей - самая большая). <a href="http://pastebin.com/UY70bwrN" rel="nofollow"> Вот запрос , но я настоятельно рекомендую, чтобы он был непонятным, потому что он создан из очень старого инструмента в устаревшей системе, и с общим проектом очень трудно работать. Меня интересует только вопрос, описанный выше

Ответы [ 2 ]

2 голосов
/ 27 января 2012

OR сравнения занимают много времени, так как вам нужно проверять каждую запись для каждой возможности.

Заключение OR в круглые скобки обрабатывает их как набор и позволяет проводить короткие оценки.

Ваш первый запрос оценивается как:

WHERE (Expr1 --required
AND   Expr2) --required
OR    Expr3 --but you can skip those to find this
OR    Expr4 --or this

Требуется больше времени, чтобы проверить все 3 условия.

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

2 голосов
/ 27 января 2012

Вторая версия требует, чтобы expr1 было верно для всех записей.Если expr1 зависит только от одной таблицы, то СУБД может «протолкнуть» предикат «вниз» и выполнить эту фильтрацию еще до выполнения объединений.(Даже если это зависит от нескольких таблиц, его можно по крайней мере сдвинуть перед некоторыми объединениями.) Это потенциально позволяет изучить на 1007 * много меньше записей и значительно лучше использоватьиндексы.

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