CLUSTER

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


Синтаксис

CLUSTER [VERBOSE] имя_таблицы [ USING имя_индекса ]
CLUSTER ( параметр [, ...] ) имя_таблицы [ USING имя_индекса ]
CLUSTER [VERBOSE]

где параметром может быть:

    VERBOSE [ логическое_значение ]

Описание

Команда CLUSTER дает указание QHB кластеризировать таблицу, заданную в параметре имя_таблицы, основываясь на индексе, заданном в параметре имя_индекса. Индекс уже должен быть определен в таблице имя_таблицы.

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

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

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

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


Параметры

имя_таблицы

Имя таблицы (может быть дополнено схемой).

имя_индекса

Имя индекса.

VERBOSE

Выводит отчет о ходе кластеризации при обработке каждой таблицы.

логическое_значение

Определяет, должен ли заданный параметр быть включен или выключен. Чтобы включить параметр, можно написать TRUE, ON или 1, а чтобы выключить — FALSE, OFF или 0. Кроме того, логическое_значение можно опустить, и в этом случае подразумевается TRUE.


Примечания

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

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

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

Когда используется последовательное сканирование и сортировка, также создается временный файл сортировки, так что пиковое требование к временному пространству равно удвоенному размеру таблицы плюс размеры индексов. Этот метод часто работает быстрее, чем метод сканирования индекса, но если требование к дисковому пространству неприемлемо, этот вариант можно выключить, временно установив в параметре 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.


См. также

clusterdb, подраздел Отчет о ходе выполнения CLUSTER