Разные планы объяснения в SQL Developer против плана объяснения для команды - PullRequest
0 голосов
/ 20 ноября 2018

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

SELECT *
  FROM employees e,
       departments d
 WHERE e.employee_id = d.manager_id;

Вот план объяснения, который я получил с помощью команды плана объяснения. с помощью команды EXPLAIN PLAN FOR enter image description here

https://i.hizliresim.com/JZdB2o.jpg https://hizliresim.com/JZdB2o https://pasteboard.co/HO9ARcl.jpg

Но, еслиЯ получаю план объяснения того же запроса с разработчиком SQL, я вижу существенно другой план объяснения.В частности, он записывает полный доступ к таблице снизу, но поверх него пишет доступ к таблице по индексу rowid.

Вот план объяснения, полученный мной от разработчика SQL. от SQL Developer Explain Plan button enter image description here

https://i.hizliresim.com/DYoYbv.jpg https://hizliresim.com/DYoYbv https://pasteboard.co/HO9BxfA.jpg

Мой вопросМожет ли кто-нибудь объяснить шаг за шагом объяснение плана разработчика SQL ?И почему SQL Developer и команда объяснения плана генерируют разные планы объяснения?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

То, что вы видите, является артефактом адаптивного плана;вы на самом деле видите обе версии плана в выходных данных.Серые линии - это версия плана, которая не была выполнена.

0 голосов
/ 20 ноября 2018

Существует несколько различных способов получить план для запроса в SQL Developer.

Объяснить план enter image description here

Кэшированный план enter image description here

DBMS_XPLAN enter image description here

Какой метод вы используете?Вы обрезали свою фотографию так, что мы не можем сказать, является ли это кэшированным планом из V $ SQL_PLAN или плана объяснения.

Теперь, по сути вашего вопроса - не используйте План объяснения.Это может быть ненадежным.Он показывает вам план, который можно выполнить, но не показывает фактический план, который использовался или будет использоваться.

Также отметьте это в выходных данных вашего плана -

-- это адаптивный план

Адаптивные планы в Oracle Database 12c допускают изменения во время выполнения планов выполнения.Обычно это происходит потому, что статистика лжет оптимизатору.БД считает, что существует 5 строк, но когда она читает их из индекса или таблицы, она находит 50 000 строк.Таким образом, база данных идет, к черту это, мы собираемся сделать что-то еще.

Так что мой совет -

Соберите статистику по вашим двум таблицам:

BEGIN
    dbms_stats.gather_table_stats(ownname => 'HR', tabname => 'EMPLOYEES', estimate_percent => 100);
    dbms_stats.gather_table_stats(ownname => 'HR', tabname => 'DEPARTMENTS', estimate_percent => 100);
END;

Затем, запустите ваши планы снова.За исключением этого времени, не используйте EXPLAIN PLAN FOR - используйте 2-й или 3-й вариант, который я показываю выше.

...