Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Школяр
Guest |
Зависит ли результат работы CBO от порядка расположения условий в WHERE? Вариант 1
Вариант 2
Может ли так получиться, что план для Варианта 2 будет другим, чем для Варианта 1 при всех прочих равных условиях? А для RBO? В доке ссылок по теме не нашел. Вопрос вознику в силу того, что один гуру утверждает, что одно из моих условий нужно поставить первым, т.к. "всегда так надо делать". На моей базе строится тот же план, но гуру говорит, что в общем случае план может поменяться в лучшую сторону, поэтому условие надо обязательно переставить. Сомнительно, однако, что план CBO зависит от порядка условий. Или как? |
||
13 июл 05, 12:38 [1699410] Ответить | Цитировать Сообщить модератору |
DinoRay Member Откуда: Киев Сообщений: 108 |
Непомню где читал кажется Секреты Oracle SQL разбор секции WHERE ничинается с конца А план менятся не должен.. Другое дело FROM Пусть твой гуру тебе докажет что план меняется... |
13 июл 05, 12:59 [1699551] Ответить | Цитировать Сообщить модератору |
Viewer Member Откуда: Самара Сообщений: 5369 |
посмотри подборку из FAQ |
13 июл 05, 13:01 [1699568] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30028 |
Порядок соединения таблиц и обработки условий |
13 июл 05, 13:10 [1699638] Ответить | Цитировать Сообщить модератору |
johanna Member Откуда: заслуженная батаничка в третьем поколении Сообщений: 7400 |
недавно(неделю назад) меня учили ораклисты, что никакой роли порядок в WHERE не играет. А вопрос я специально задала. |
13 июл 05, 23:59 [1702169] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30028 |
![]()
|
|||
14 июл 05, 09:21 [1702521] Ответить | Цитировать Сообщить модератору |
kosour Member Откуда: Сообщений: 236 |
К сожалению данный пример показывает различия при выполнении запроса (точнее, что используется "быстрая проверка условий" с конце where (т.е. до первого FALSE), а не при построении его плана. Кстати в данном примере в обоих случаях планы одинаковы :) |
|||
14 июл 05, 09:54 [1702656] Ответить | Цитировать Сообщить модератору |
kosour Member Откуда: Сообщений: 236 |
от порядка во FROM тоже не зависит (если нет хинта ORDERED) почти. Если оптимизатор успеет все возможные планы запросов построить (количество < OPTIMIZER_PLAN_PERMUTATIONS) |
||
14 июл 05, 09:56 [1702668] Ответить | Цитировать Сообщить модератору |
Я и ёжик Member Откуда: СПб Сообщений: 1815 |
Порядок и место вычисления предикатов тоже часть плана. Так что всё таки разные.
Oracle® Data Cartridge Developer's Guide.10g Release 1 (10.1). Part Number B10800-01. Predicate Ordering Metalink Note:276877.1 How the performance of the query is influenced by its predicate order |
||||
14 июл 05, 10:22 [1702781] Ответить | Цитировать Сообщить модератору |
johanna Member Откуда: заслуженная батаничка в третьем поколении Сообщений: 7400 |
так мы там сразу и проверили, при перестановке в WHERE сгенерированные планы ничем не различались. |
||
14 июл 05, 11:58 [1703352] Ответить | Цитировать Сообщить модератору |
kosour Member Откуда: Сообщений: 236 |
А как увидеть это различие в планах ? На примере данных двух селектов. |
||
14 июл 05, 12:02 [1703385] Ответить | Цитировать Сообщить модератору |
Я и ёжик Member Откуда: СПб Сообщений: 1815 |
Посмотреть планы :)
|
|||
14 июл 05, 12:14 [1703445] Ответить | Цитировать Сообщить модератору |
Школяр
Guest |
Спасибо, на Металинке все хорошо обьяснено. |
||||||
14 июл 05, 12:28 [1703510] Ответить | Цитировать Сообщить модератору |
johanna Member Откуда: заслуженная батаничка в третьем поколении Сообщений: 7400 |
так это у вас не CBO а RBO(Rule Based Optimizator). Вопрос же был про CBO. |
||
14 июл 05, 12:44 [1703589] Ответить | Цитировать Сообщить модератору |
Я и ёжик Member Откуда: СПб Сообщений: 1815 |
P.S. Вообще говоря, предикаты могут быть и несколько сложнее чем 1 < 0, и содержать в том числе подзапросы. Ниже пример с двумя предикатами: ( select count(*) from table_big tb where tb.f1 = table1.object_id) > 0 и ( select count(*) from table_small ts where ts.f1 = table1.object_id) > 0. Условия обоих никогда не выполняются, оба выполняют full scan ( индексы преднамеренно не построены ), один по большой таблице, другой по маленькой. Различия при перестановке этих предикатов явно видны и в плане ( порядок обращения к таблицам ) и особенно во времени и статистике выполнения:
|
|
14 июл 05, 12:50 [1703622] Ответить | Цитировать Сообщить модератору |
Я и ёжик Member Откуда: СПб Сообщений: 1815 |
Вот вам CBO:
В идеале конечно порядок предикатов влияния оказывать не должен, но пока мы имеем дело с неидеальным оптимизатором. Важный, на мой взгляд, состоит в том, что не стоит закладываться на определенный порядок обработки придекатов запроса, писать запрос лучше так, что бы правильность его выполнения не зависила от порядка вычисления предикатов. Обработка может менятся от версии к версии, добавляются новые возможности и.т.д и.т.п. |
|||
14 июл 05, 13:17 [1703789] Ответить | Цитировать Сообщить модератору |
johanna Member Откуда: заслуженная батаничка в третьем поколении Сообщений: 7400 |
ну и чем они отличаются? кстати один и тот же statement обычно первый раз выполняется дольше(это по-вашему примеру выше) |
||
14 июл 05, 13:25 [1703841] Ответить | Цитировать Сообщить модератору |
Я и ёжик Member Откуда: СПб Сообщений: 1815 |
Порядком предикатов :)
Сравните число логических чтений в обоих случаях. В первом выполняется full scan по большой таблице ( table_big, ~26 тыс. записей), выполняется он для каждой строки из исходной таблицы ( table1, тоже ~ 26 тыс. раз ) всегда возвращает 0 и следующий предикат ( по малой таблице с 10-ю записями) присоедененный по and не проверяется. Во втором первым выполняется full scan по малой таблице ( table_small, 10-записей), который также всегда возыращает 0 и предикат с сканированием большой таблицы не выполняется. т.е. мы имеем всего ~26 тыс. сканирований по малой таблице. Эффекта от кеширования при повторных выполнениях здесь заметно не будет. |
|||||||
14 июл 05, 14:14 [1704144] Ответить | Цитировать Сообщить модератору |
Andrew Max Member Откуда: Сообщений: 1045 |
Интересная тема. Итак, все пришли к выводу, что для CBO порядок предикатов важен? И кажется, что эксперимент, который выполнил Я и ежик, только подтверждает это. Однако, меня несколько смущает строка cpu costing is off в его примере. К тому же, зачем брать вырожденный случай и экспериментировать с dual? Давайте возьмем более реальную таблицу:
Итак, для RBO порядок предикатов, действительно, имеет значение. И похоже, что предикаты «вычисляются» в порядке справа – налево. Теперь посмотрим, как поведет себя CBO.
Вот те на! В обоих случаях план одинаков… :) Или я что-то сделал не так?... Кстати, для того, чтобы все-таки «заставить» Oracle сначала «вычислять» условие COL2 > ‘Test’, можно использовать известный хинт:
|
|||
14 июл 05, 16:10 [1704932] Ответить | Цитировать Сообщить модератору |
johanna Member Откуда: заслуженная батаничка в третьем поколении Сообщений: 7400 |
нет так как "я и ежик" использовал в качестве предикатов подзапросы, а это уже другой случай. |
||
14 июл 05, 16:26 [1705047] Ответить | Цитировать Сообщить модератору |
Я и ёжик Member Откуда: СПб Сообщений: 1815 |
Нет, не так, порядок может быть важен.
Включение cpu costing для предикатов типа 1<0 и 1/0>0 ничего не изменяет. Просили показать на примере , что привел Elic.
Всё так, в данном случае CBO в состоянии различить селективность предикатов и выстраивает их в соответствующем порядке. Можете посмотреть у Льюиса в Understanding System Statistics, раздел Predicate Order. Предикаты бывают разные, в общем случае говорить, что порядок влияет или не влияет нельзя. Кроме того надо учитывать, что оптимизатор может перемещать предикаты по дереву запроса, вставлять предикаты, удалять предикаты, могут быть изменены параметры, кроме того запрос может быть преобразован, отхинтован (часть из этих возможностей Вы и продемонстрировали) и.т.д и.т.п см. ноту. Я уже писал выше, что запрос писать надо так, чтобы порядок выполнения предикатов не влиял на правильность выполнения запроса. А будет ли зависить эфективность выполнения запроса от порядка предикатов надо смотреть в каждом конкретном случае, на конкретном сервере с конкретными настройками. |
||||||
14 июл 05, 16:40 [1705142] Ответить | Цитировать Сообщить модератору |
Andrew Max Member Откуда: Сообщений: 1045 |
Все так, согласен. :) Льюиса сейчас читать некогда, но я и так верю, что если оптимизатор может оценить селективность предикатов, он "выстроит" их в наиболее оптимальном порядке. Было бы весьма печально, если бы Оракл этого не умел. Ясно, что в этом Вашем запросе:
|
|||
14 июл 05, 16:53 [1705220] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
dmidek Member Откуда: Киев - Дортмунд Сообщений: 117674 |
Прошу прощения, что поднял тему со дна морского :-) У меня в программе динамически генерируется запрос такого типа INSERT INTO SELECT .... FROM ..... WHERE ......... AND 1 = 0 UNION ALL INSERT INTO SELECT .... FROM ..... WHERE ......... AND 1 = 0 UNION ALL INSERT INTO SELECT .... FROM ..... WHERE ......... AND 1 = 1 UNION ALL Последний нолик или единичка поступают как элементы ассоциированного массива из внешнего приложения. Они сообщают нам, что некое условие или выполнено (1) или не выполнено (0) и как бы стОит проверять дальше или ни к чему ... В последнее время стала подседать производительность. Появилось предположение, что производительность может в частности упасть из за того, что другие условия в запросах с 1=0 тем не менее выполняются, хотя это и абсолютно ни к чему. Эксперсс-тесты в 10.2.0.4 показали, что последнее условие по прежнему вроде бы выполняется первым. Но насколько надежно это знание ? Очень интересует Ваше мнение. В качестве альтернативы продумывается идея, просто распарсивать запрос так, чтобы при 0 вообще "выкидывать" это условие из цепочки UNION. Это изменение довольно неприятное и громоздкое, и хочется убедиться, что усилия будут затрачены не напрасно... Каково Ваше мнение / знание , привязанное возможно к версии 10.2.0.4 ? - Порядок случаен - Порядок вообще то от конца к началу но рассчитывать на это не стоит - Порядок жесткий - от конца к началу - Что то иное :-) Заранее спасибо, в эти 2 дня почти не буду на форуме, поэтому не взыщите - я потом все прочитаю и напишу :-) |
29 июн 09, 22:11 [7356361] Ответить | Цитировать Сообщить модератору |
wildwind Member Откуда: Москва Сообщений: 1296 |
Смотря как получено и в каком виде. Если в виде разницы в количестве LIO, то полагаю надежно. |
||
29 июн 09, 22:34 [7356421] Ответить | Цитировать Сообщить модератору |
bigsov Member Откуда: Сообщений: 282 |
не судите строго, попробовал привести пример, когда на 10ке порядок предикатов меняет план запроса:
BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production |
||
30 июн 09, 02:31 [7356954] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Oracle | ![]() |