Найти тему
Илья Хохлов

Получение плана выполнения запроса с помощью EXPLAIN PLAN

Любой запрос, даже без условия во WHERE и без джоинов с таблицами, будет выполняться по какому-то плану. СУБД (например, ORACLE или MS SQL Server) может оценить запрос до его выполнения, то есть то, как он будет выполнен и дать примерную оценку своих трудозатрат на каждый этап действий (сколько примерно данных с жёсткого диска будет прочитано, сколько нужно процессорных ресурсов для просчёта чего-либо или для расстановки данных в нужном порядке и т.д).

В разных программах работы с базами данных получение плана запроса может быть более удобным чем в других программах.

Рассмотрим один из примеров нашего курса по SQL: напишем запрос, выводящий список продаж блюд столовой за определённое число. В качестве СУБД будем работать в ORACLE. Пусть нужно вывести продажи за 16.01.2019.

-2

Выберутся данные:

-3

Чтобы посмотреть план этого запроса, то есть то, как ORACLE его выполняет, в программе SQL Developer нужно нажать кнопку:

-4

В результате откроется ещё одна вкладка отображения плана выполнения запроса «Explain Plan» (с англ. «Объясни план»):

-5

На что обратить внимание: Здесь мы видим, что запрос использует выборку только из одной таблицы – PERSONCANTEENORDER и в результате будут отобраны 66 строк (это указано в графе CARDINALITY), и стоить это будет СУБД = 7. Это внутренняя оценка ORACLE. Чем меньше это число, тем лучше. Важно обратить внимание, что напротив таблицы PERSONCANTEENORDER указано, что будет использован полный перебор строк (TABLE ACCESS FULL). То есть Ораклу придётся пробежаться по всей таблице, проверять каждую строку, подходит ли она под условия, указанные во WHERE. Мы бы увидели совсем другую картину, если бы для таблицы PERSONCANTEENORDER был бы индекс для столбца DATEORDER. Тогда бы ORACLE не пришлось перебирать все строки таблицы, чтобы выбрать те, у которых в столбце DATEORDER нужная дата.

Основы, что такое индексы, я написал в предыдущей статье - здесь.

Давай добавим индекс для таблицы PERSONCANTEENORDER для столбца DATEORDER. Для этого, в окне дерева объектов, раскроем список таблиц (Tables) и щёлкнем правой кнопкой мыши по таблице PERSONCANTEENORDER и выберем Edit (Редактировать).

-6

В открывшемся окне перейдём в опции Indexes и нажмём плюсик (добавить):

-7

Откроется панель добавления нового индекса. Дадим ему имя и определим для какого столбца он будет создан.

-8

Индекс может быть создан не только для одного какого-то конкретного столбца, но и для комбинации столбцов.

Как правило, индексам дают осмысленные имена, с помощью которых можно понять и к какой таблице он относится, и для каких столбцов он создан. Это имя будет видно и в планах запросов и показываться, например, при ошибках. Чтобы можно было быстро понять, о чем речь.

Нажмём кнопку «Ок».

Получим план выполнения запроса заново:

-9

Как видим, выборка данных из таблицы осуществляется уже не полным перебором строк таблицы, а с использованием индекса (и указано его имя). Конечная стоимость выполнения запроса COST стала равна пяти (заместо семи). Так как таблица не сильно большая, то и разницы особой в оценке мы не заметили. Индекс даст существенное превосходство в таблицах с большим объёмом данных. В таблицах с большим объёмом данных без индексов вообще не работают!

На нашем Youtube-канале найдёшь много интересного и полезного про базы данных и язык SQL.

Если есть Telegram, подписывайтесь на наш канал в Телеграмме. Несколько раз в неделю решаем вместе разные задачи по SQL, и ещё помогаю не выпадать из темы айти. Делюсь полезной информацией и техническим-юмором:)

А здесь ты можешь пройти наш курс обучения языку SQL и получить мощные знания и умения! Всего за 27 уроков до уровня специалиста, имеющего трёхлетний стаж. Много практики в реальной базе данных! С нашей поддержкой и проверкой твоих самостоятельный задач! Записывайся, буду тебя ждать!