2016-11-03 3 views
1

У меня есть запрос:Oracle плана выполнения изменение

   SELECT COUNT(1) 
      FROM registration r, 
        proxy p 
      WHERE r.participant_code = p.participant_code 
       AND r.proxy_type = p.proxy_type 
       AND r.proxy_value = p.proxy_value 
       AND r.proxy_sequence= p.proxy_sequence 

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

После этого запроса был изменен немного (присоединяется к 'r.proxy_value = p.proxy_value' и 'r.proxy_type = p.proxy_type', где поменяны местами):

   SELECT COUNT(1) 
      FROM registration r, 
        proxy p 
      WHERE r.participant_code = p.participant_code 
       AND r.proxy_value = p.proxy_value     
       AND r.proxy_type = p.proxy_type 
       AND r.proxy_sequence= p.proxy_sequence 

На самом деле оба запроса эквивалентны. Однако после этого изменения план выполнения второго запроса начинает использовать сканирование индекса вместо полного сканирования.

Теперь у меня есть очень конкретный вопрос:

Будет ли Oracle перекомпилировать второй запрос и он будет вести для запроса выполнения изменения плана?

+0

Эти два вопроса являются _apparently_ эквивалентными/идентичными, за исключением порядка условий в предложении 'WHERE'. Хотя интуитивно можно подумать, что они такие же, я бы сделал их одинаковыми и повторными (да, я согласен с вами в том, что эти швы являются очень любительским комментарием, но я был слишком удивлен в своей жизни этот тип вещей). – FDavidov

+0

Вы знаете, на самом деле я протестировал этот сценарий (да, поведение было изменено, также обратите внимание, что очень сложно перепроверить, потому что у меня нет контроля над механизмом управления планом выполнения Oracle), мне нужно подробное объяснение того, как Oracle рассматривает эту ситуацию. Будут оценены любые ссылки на документацию Oracle. – mvb13

+0

Я не уверен, что я тебя. Вы сделали оба варианта одинаковыми (изменив порядок условий в предложении 'WHERE')? Если да, вы наблюдали за ними различные планы выполнения? – FDavidov

ответ

2

В настоящее время Oracle использует оптимизатор затрат (CBO) по сравнению с прежним оптимизатором на основе правил, который был более предсказуемым, но менее способным в сценариях хранилища данных.

В целом, CBO представила проблемы с «плановой стабильностью», тогда как планы RBO всегда оставались неизменными.

Использование CBO означает, что планы выполнения могут и будут изменяться самостоятельно, основываясь на изменениях в статистике и/или данных динамической выборки. Существуют инструменты, которые позволяют контролировать историю переключения плана (например, lab128).

Еще один момент, который я заметил при рассмотрении вашего запроса: нет фильтров, поэтому в зависимости от того, что представляют собой ваши первичные ключи, может быть мало использования для сканирования индекса.

+0

@ mvb13 - это тоже мое предположение, что изменилось, данные. Можете ли вы генерировать планы объяснений на основе точно таких же данных в определенный момент времени и сравнивать их? (Имейте в виду, что если вы запустите два запроса в двух разных сеансах, даже в то же время, их данные могут по-прежнему отличаться, если один или оба сеанса имеют/неблокированные транзакции). – mathguy

Смежные вопросы