CLUSTER#

CLUSTER

CLUSTER

CLUSTER — кластеризовать таблицу в соответствии с индексом

Синтаксис

CLUSTER [VERBOSE] table_name [ USING index_name ]
CLUSTER ( option [, ...] ) table_name [ USING index_name ]
CLUSTER [VERBOSE]

where option can be one of:

    VERBOSE [ boolean ]

Описание

CLUSTER указывает Tantor SE упорядочить таблицу, указанную параметром table_name, на основе индекса, указанного параметром index_name. Индекс должен быть уже определен для таблицы, указанной параметром table_name.

Когда таблица кластеризуется, она физически переупорядочивается на основе информации об индексе. Кластеризация - это одноразовая операция: при последующем обновлении таблицы изменения не кластеризуются. То есть не предпринимается попытка хранить новые или обновленные строки в соответствии с порядком индекса. (Если желательно, можно периодически проводить повторную кластеризацию, выполнив команду снова. Кроме того, установка параметра хранения fillfactor таблицы на значение меньше 100% может помочь сохранить порядок кластера во время обновлений, поскольку обновленные строки сохраняются на той же странице, если там есть достаточно места).

Когда таблица кластеризуется, Tantor SE запоминает, какой индекс использовался для кластеризации. Форма CLUSTER table_name повторно кластеризует таблицу, используя тот же самый индекс. Также можно использовать формы CLUSTER или SET WITHOUT CLUSTER команды ALTER TABLE для установки индекса, который будет использоваться для будущих операций кластеризации, или для очистки предыдущих настроек.

CLUSTER без table_name перекластеризует все ранее кластеризованные таблицы в текущей базе данных, которые принадлежат вызывающему пользователю, или все такие таблицы, если вызвано суперпользователем. Эта форма CLUSTER не может быть выполнена внутри блока транзакции.

Когда таблица кластеризуется, на нее накладывается эксклюзивная блокировка ACCESS EXCLUSIVE. Это предотвращает любые другие операции с базой данных (как чтение, так и запись) на этой таблице до завершения команды CLUSTER.

Параметры

table_name

Имя (возможно, с указанием схемы) таблицы.

index_name

Имя индекса.

VERBOSE

Печатает отчет о ходе выполнения, когда каждая таблица кластеризуется.

boolean

Определяет, должна ли быть включена или выключена выбранная опция. Вы можете написать TRUE, ON или 1, чтобы включить опцию, и FALSE, OFF или 0, чтобы отключить ее. Значение boolean также можно опустить, в этом случае предполагается TRUE.

Примечания

В случаях, когда вы получаете доступ к отдельным строкам случайным образом внутри таблицы, фактический порядок данных в таблице не имеет значения. Однако, если вы часто обращаетесь к некоторым данным чаще, чем к другим, и есть индекс, который группирует их вместе, вы получите выгоду от использования CLUSTER. Если вы запрашиваете диапазон индексированных значений из таблицы или отдельное индексированное значение, которое имеет несколько строк, соответствующих ему, CLUSTER поможет, потому что после того, как индекс определит страницу таблицы для первой строки, которая соответствует, все остальные строки, которые соответствуют, вероятно, уже находятся на той же странице таблицы, и поэтому вы экономите обращения к диску и ускоряете запрос.

CLUSTER может пересортировать таблицу, используя либо сканирование индекса на указанном индексе, либо (если индекс является b-деревом) последовательное сканирование, за которым следует сортировка. Он попытается выбрать метод, который будет быстрее, основываясь на параметрах стоимости планировщика и доступной статистической информации.

Когда используется индексное сканирование, создается временная копия таблицы, которая содержит данные таблицы в порядке индекса. Также создаются временные копии каждого индекса на таблице. Поэтому необходимо иметь свободное место на диске, по крайней мере, равное сумме размера таблицы и размеров индексов.

Когда используется последовательное сканирование и сортировка, также создается временный файл сортировки, поэтому максимальное требование к временному пространству составляет в два раза больше размера таблицы, плюс размеры индексов. Этот метод часто работает быстрее, чем метод сканирования индекса, но если требование к дисковому пространству неприемлемо, вы можете отключить этот выбор, временно установив enable_sort в off.

Следует установить параметр maintenance_work_mem в разумно большое значение (но не больше объема оперативной памяти, который вы можете выделить для операции CLUSTER) перед кластеризацией.

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

Поскольку CLUSTER запоминает, какие индексы кластеризованы, можно вручную кластеризовать таблицы в первый раз, а затем настроить периодический сценарий обслуживания, который выполняет CLUSTER без параметров, чтобы желаемые таблицы периодически кластеризовались.

Каждый запущенный бэкенд, выполняющий команду CLUSTER, будет отображать свой прогресс в представлении pg_stat_progress_cluster. Подробности см. в разделе Раздел 27.4.2.

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

Примеры

Сгруппируйте таблицу employees на основе ее индекса employees_ind:

CLUSTER employees USING employees_ind;

Кластеризуйте таблицу employees с использованием того же индекса, который использовался ранее:

CLUSTER employees;

Кластеризовать все таблицы в базе данных, которые ранее были кластеризованы:

CLUSTER;

Совместимость

В стандарте SQL нет оператора CLUSTER.

Синтаксис

CLUSTER index_name ON table_name

также поддерживается для совместимости с предыдущими версиями PostgreSQL до 8.3.