CLUSTER#
CLUSTER
CLUSTER — кластеризовать таблицу в соответствии с индексом
Синтаксис
CLUSTER [VERBOSE]table_name
[ USINGindex_name
] CLUSTER (option
[, ...] )table_name
[ USINGindex_name
] CLUSTER [VERBOSE] whereoption
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
.
Синтаксис
CLUSTERindex_name
ONtable_name
также поддерживается для совместимости с предыдущими версиями PostgreSQL до 8.3.