Описание операций плана выполнения в Postgresql |
||
Данная статья представляет собой описание основных операций, отображаемых в планах выполнения запросов СУБД PostgreSQL. Seq Scan
Операция сканирует всю таблицу в порядке, в котором она хранится на диске. Обычно наличие этой операции плохо отражается на производительности, поскольку она предполагает последовательное чтение для извлечения большого числа строк, приводя к более медленной обработке. Но бывают исключения, например, применение директивы Limit, ограничивающей число возвращаемых записей.
Index Scan
Сканирование индекса выполняет обход индекса, просматривает конечные узлы, чтобы найти все соответствующие записи, и извлекает соответствующие данные из таблицы. В большинстве случаев является хорошей для производительности, так как представляет собой прямой доступ к требуемым строкам данных.
Bitmap Index Scan
В то время как Index Scan извлекает один указатель кортежа за раз из индекса и немедленно переходит к этому кортежу в таблице, Bitmap Index Scan извлекает все указатели кортежей из индекса за один раз, сортирует их, используя структуру данных "битовая карта (bitmap)" в оперативной памяти, а затем просматривает кортежи таблиц в порядке физического расположения кортежей.
Merge Join
Соединение слиянием объединяет два отсортированных списка. Обе стороны объединения должны быть предварительно отсортированы.
Nested Loops
Соединение вложенными циклами объединяет две таблицы, выбирая результат из одной таблицы и запрашивая другую таблицу для каждой строки из первой. Встречается очень часто. Выполняет довольно эффективное соединение относительно небольших наборов данных.
Соединение вложенными циклами не требует сортировки входных данных.
Hash Join
Хеш-соединение загружает записи-кандидаты с одной стороны соединения в хеш-таблицу, которая затем проверяется для каждой строки с другой стороны соединения. Операция используется всегда, когда невозможно применить другие виды соединения: если соединяемые наборы данных достаточно велики и/или наборы данных не упорядочены по столбцам соединения.
Sort
Сортирует набор по столбцам, указанным в Sort Key. Операция сортировки требует больших объемов памяти для материализации промежуточного результата.
Aggregate
Появляется в плане, если в запросе есть агрегатная функция, используемая для вычисления отдельных результатов из нескольких входных строк: COUNT, SUM, AVG, MAX, MIN и прочие.
GroupAggregate
Группирует предварительно отсортированный набор в соответствии с предложением GROUP BY. Эта операция не буферизует промежуточный результат.
HashAggregate
Использует временную хэш-таблицу для группировки записей. Операция HashAggregate не требует предварительно отсортированного набора данных, вместо этого она использует большие объемы памяти для материализации промежуточного результата. Вывод не упорядочен каким-либо значимым образом.
Unique
Удаляет дублирующиеся данные. Практически не требует памяти: сравнивает значение в предыдущей строке с текущим и, если они одинаковые, отбрасывает его. Данные должны быть предварительно отсортированны.
Filter
Применяет фильтр к набору строк.
Limit
Прерывает выполение операций, когда было выбрано нужное количество строк.
Append
Запускает множество субопераций и возвращает все возвращенные ими строки в виде общего результата. Используется в запросах, содержащих UNION или UNION ALL.
HashSetOp
Операция используется операциями INTERSECT и EXCEPT (с опциональным модификатором ALL). Она работает следующим образом: запускает субоперации Append для пары подзапросов, а затем, на основании результата и опционального модификатора ALL, решает, какие строки нужно вернуть.
Materialize
Операция получает данные из нижележащей операции и размещает их в памяти (или частично в памяти), чтобы ими можно было быстрее воспользоваться, или добавляет им дополнительные свойства, которые предыдущая операция не предоставляет.
CTE Scan
Схожа с Materialize. Операция запускает часть запроса и сохраняет ее вывод, чтобы он мог быть использован другой частью (или частями) запроса.
SubPlan
Операция означает подзапрос, в котором есть ссылки на основной запрос. Вызывается, чтобы посчитать данные из подзапроса, которые зависят от текущей строки.
InitPlan
Операция означает подзапрос, у которого нет ссылок на основной запрос. Операция появляется в плане, когда есть часть запроса, которую можно (или нужно) вычислить прежде всего, и она не зависит ни от чего в остальной части запроса.
Subquery Scan
Операция означает подзапрос, входящий в UNION.
|