CLUSTER
CLUSTER — кластеризовать таблицу согласно индексу
Синтаксис
CLUSTER [VERBOSE]имя_таблицы
[ USINGимя_индекса
] CLUSTER (параметр
[, ...] )имя_таблицы
[ USINGимя_индекса
] CLUSTER [VERBOSE] здесь допускаетсяпараметр
: VERBOSE [boolean
]
Описание
Оператор CLUSTER
указывает Postgres Pro кластеризовать таблицу, заданную параметром имя_таблицы
, согласно индексу, заданному параметром имя_индекса
. Указанный индекс уже должен быть определён в таблице имя_таблицы
.
В результате кластеризации таблицы её содержимое физически переупорядочивается в зависимости от индекса. Кластеризация является одноразовой операцией: последующие изменения в таблице нарушают порядок кластеризации. Другими словами, система не пытается автоматически сохранять порядок новых или изменённых строк в соответствии с индексом. (Если такое желание возникает, можно периодически повторять кластеризацию, выполняя команду снова. Кроме того, если для заданной таблицы установить параметр FILLFACTOR
меньше 100%, это может помочь сохранить порядок кластеризации при изменениях, так как изменяемые строки будут помещаться в ту же страницу, если в ней достаточно места.)
Когда таблица кластеризована, Postgres Pro запоминает, по какому именно индексу. Форма CLUSTER
повторно кластеризует таблицу по тому же индексу. Для установки индекса, который будет использоваться для будущих операций кластеризации, или очистки предыдущего значения можно также применить команду имя_таблицы
CLUSTER
или формы SET WITHOUT CLUSTER
команды ALTER TABLE
.
CLUSTER
без имени_таблицы
повторно кластеризует все ранее кластеризованные таблицы в текущей базе данных, которые принадлежат вызывающему команду пользователю, или все такие таблицы, если её вызывает суперпользователь. Эту форму CLUSTER
нельзя выполнять внутри блока транзакции.
В процессе кластеризации таблицы для неё запрашивается блокировка ACCESS EXCLUSIVE
. Это препятствует выполнению всех других операций (чтению и записи) с таблицей до завершения CLUSTER
.
Параметры
имя_таблицы
Имя таблицы (возможно, дополненное схемой).
имя_индекса
Имя индекса.
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
. За подробностями обратитесь к Подразделу 26.4.2.
При кластеризации секционированной таблицы каждая из её секций кластеризуется согласно секции заданного секционированного индекса. Индекс при кластеризации секционированной таблицы должен указываться обязательно. CLUSTER
нельзя выполнять внутри блока транзакции.
Примеры
Кластеризация таблицы employees
согласно её индексу employees_ind
:
CLUSTER employees USING employees_ind;
Кластеризация таблицы employees
согласно тому же индексу, что был использован ранее:
CLUSTER employees;
Кластеризация всех таблиц в базе данных, что были кластеризованы ранее:
CLUSTER;
Совместимость
Оператор CLUSTER
отсутствует в стандарте SQL.
Синтаксис
CLUSTERимя_индекса
ONимя_таблицы
так же является допустимым для совместимости с PostgreSQL до версии 8.3.