Перейти к основному содержимому

CLUSTER

примечание

Эта страница переведена при помощи нейросети GigaChat.

CLUSTER - кластеризация таблицы в соответствии с индексом.

Синтаксис

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

where option can be one of:

VERBOSE [ boolean ]

Описание

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

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

Когда таблица объединяется в кластер, PostgreSQL запоминает индекс, по которому она была объединена в кластер. Форма 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.

Примечания

Для кластеризации таблицы необходимо иметь привилегию MAINTAIN для этой таблицы.

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

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

Во время выполнения CLUSTER временно изменяется путь поиска search_path до pg_catalog, pg_temp.

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

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

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

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

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

Каждый процесс, выполняющий CLUSTER, будет сообщать о своем прогрессе в представлении pg_stat_progress_cluster. Смотрите раздел «Отчет о ходе выполнения CLUSTER» для получения подробной информации.

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

Примеры

Кластеризация таблицы employees на основе ее индекса employees_ind:

CLUSTER employees USING employees_ind;

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

CLUSTER employees;

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

CLUSTER;

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

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

Следующий синтаксис использовался до версии PostgreSQL 17 и по-прежнему поддерживается:

CLUSTER [ VERBOSE ] [ table_name [ USING index_name ] ]

Следующий синтаксис использовался до версии PostgreSQL 8.3 и по-прежнему поддерживается:

CLUSTER index_name ON table_name

Смотрите также

clusterdb, «Отчет о ходе выполнения кластера»