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.

См. также

clusterdb