CLUSTER
CLUSTER — кластеризовать таблицу согласно индексу
Синтаксис
CLUSTER [VERBOSE] имя_таблицы [ USING имя_индекса ]
CLUSTER [VERBOSE]
Описание
Команда CLUSTER
дает указание QHB кластеризировать таблицу, заданную в параметре
имя_таблицы, основываясь на индексе, заданном в имя_индекса. Индекс уже
должен быть определен в имя_таблицы.
Когда таблица кластеризуется, она физически переупорядочивается на основе данных индекса. Кластеризация является одноразовой операцией: при последующем обновлении таблицы изменения не кластеризуются. То есть не предпринимается никаких попыток сохранить новые или обновленные строки в соответствии с их порядком индексирования. (При желании можно периодически повторять кластеризацию, выполняя команду снова. Кроме того, установка у таблицы параметра FILLFACTOR меньше 100% может помочь сохранить порядок кластеризации во время обновлений, так как обновленные строки останутся на той же странице, если там доступно достаточно места.)
Когда таблица кластеризуется, QHB запоминает, по какому индексу
она была кластеризована. Форма CLUSTER имя\_таблицы
повторно кластеризует
таблицу, используя тот же индекс, что и раньше. Для установки индекса,
который будет использоваться в будущих операциях кластеризации,
или очистки предыдущего значения можно также применить команду CLUSTER
или формы SET WITHOUT CLUSTER
команды ALTER TABLE.
CLUSTER
без какого-либо параметра повторно кластеризует все ранее
кластеризованные таблицы в текущей базе данных, принадлежащей
вызывающему пользователю, или все такие таблицы, если они вызываются
суперпользователем. Эта форма CLUSTER
не может быть выполнена
внутри блока транзакций.
Когда таблица кластеризуется, запрашивается блокировка ACCESS EXCLUSIVE.
Это препятствует выполнению любых других операций базы данных (как чтению,
так и записи) над таблицей, пока CLUSTER
не будет завершена.
Параметры
имя_таблицы
Имя таблицы (может быть дополнено схемой).
имя_индекса
Имя индекса.
VERBOSE
Выводит отчет о процессе кластеризации по мере обработки таблиц.
Примечания
В случаях, когда происходит обращение к случайным единичным строкам
таблицы, фактический порядок данных в таблице не имеет
значения. Однако если имеется тенденция обращения к одним данным чаще,
чем к другим, и есть индекс, который группирует их вместе, использование
команды CLUSTER
дает преимущества. Если запросить из таблицы диапазон
индексированных значений или одно индексированное значение,
имеющее несколько соответствующих строк, CLUSTER
поможет,
так как страница таблицы, найденная по индексу для первой искомой строки,
скорее всего, будет содержать и все остальные искомые строки.
Таким образом, кластеризация помогает оптимизировать обращения к диску
и ускорить запросы.
CLUSTER
может повторно отсортировать таблицу, используя либо
сканирование по указанному индексу, либо (если индекс является
B-деревом) последовательное сканирование с последующей сортировкой. Она
будет пытаться выбрать более быстрый метод на основе плановых
параметров затрат и доступной статистической информации.
При использовании сканирования индекса создается временная копия таблицы, содержащая данные таблицы в порядке следования индексов. Также создаются временные копии каждого индекса в таблице. Поэтому для данной операции потребуется свободное пространство на диске, по крайней мере равное сумме размера таблицы и размеров индекса.
Когда используется последовательное сканирование и сортировка, также создается временный файл сортировки, так что пиковое требование к временному пространству равно удвоенному размеру таблицы плюс размеры индекса. Этот метод часто работает быстрее, чем метод сканирования индекса, но если требование к дисковому пространству неприемлемо, этот выбор можно отключить, временно установив enable_sort в OFF.
Перед кластеризацией рекомендуется установить значение
maintenance_work_mem достаточно большим (но
не больше, чем объем ОЗУ, который вы можете выделить для операции
CLUSTER
).
Поскольку планировщик записывает статистику о порядке таблиц, для новой кластеризованной таблицы рекомендуется выполнить ANALYZE. В противном случае планировщик может сделать неверный выбор планов запросов.
Поскольку CLUSTER
запоминает, какие индексы кластеризуются, можно
кластеризировать таблицы, которые требуется кластеризировать вручную в
первый раз, а затем настроить периодический сценарий обслуживания,
который будет выполнять CLUSTER
без каких-либо параметров, так что нужные
таблицы будут периодически повторно кластеризоваться.
Примеры
Кластеризация таблицы employees согласно ее индексу employees_ind:
CLUSTER employees USING employees_ind;
Кластеризация таблицы employees согласно уже использовавшемуся индексу:
CLUSTER employees;
Кластеризация всех кластеризованных ранее таблиц в базе данных:
CLUSTER;
Совместимость
В стандарте SQL нет команды CLUSTER
.