CLUSTER — кластеризация таблицы в соответствии с индексом
CLUSTER [ (option[, ...] ) ] [table_name[ USINGindex_name] ] гдеoptionможет быть одним из: VERBOSE [boolean]
CLUSTER указывает Digital Q.DataBase
кластеризовать таблицу, указанную параметром
table_name,
на основе индекса, указанного параметром
index_name. Индекс должен
быть уже определен для
table_name.
Когда таблица кластеризуется, она физически переупорядочивается
на основе информации индекса. Кластеризация — это однократная операция:
при последующем обновлении таблицы изменения не
кластеризуются. То есть не делается попыток сохранить новые или
обновленные строки в соответствии с порядком индекса. (При желании можно
периодически выполнять повторную кластеризацию, снова выполняя эту команду.
Также установка параметра хранения fillfactor таблицы меньше
100% может помочь сохранить порядок кластеризации при обновлениях, поскольку обновленные
строки остаются на той же странице, если там достаточно места.)
Когда таблица кластеризована, Digital Q.DataBase
запоминает, по какому индексу она была кластеризована. Форма
CLUSTER
повторно кластеризует таблицу, используя тот же индекс, что и раньше. Вы также можете
использовать формы table_nameCLUSTER или 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-деревом) последовательное
сканирование с последующей сортировкой. Он попытается выбрать метод, который
будет быстрее, на основе параметров стоимости планировщика и доступной статистической
информации.
Во время выполнения CLUSTER параметр search_path временно изменяется на pg_catalog,
pg_temp.
При использовании сканирования по индексу создается временная копия таблицы, содержащая данные таблицы в порядке индекса. Также создаются временные копии каждого индекса таблицы. Следовательно, вам необходимо свободное место на диске, как минимум равное сумме размера таблицы и размеров индексов.
При использовании последовательного сканирования и сортировки также создается временный
файл сортировки, так что пиковая потребность во временном пространстве составляет
до удвоенного размера таблицы плюс размеры индексов. Этот метод часто
быстрее метода сканирования по индексу, но если требования к дисковому пространству
неприемлемы, вы можете отключить этот выбор, временно установив параметр
enable_sort в значение off.
Рекомендуется установить параметр maintenance_work_mem
в достаточно большое значение (но не больше объема ОЗУ, который вы можете
выделить для операции CLUSTER) перед кластеризацией.
Поскольку планировщик записывает статистику об упорядоченности
таблиц, рекомендуется выполнить ANALYZE
на вновь кластеризованной таблице.
В противном случае планировщик может принимать плохие решения о планах запросов.
Поскольку CLUSTER запоминает, какие индексы кластеризованы,
можно вручную кластеризовать нужные таблицы один раз,
а затем настроить периодический скрипт обслуживания, который выполняет
CLUSTER без параметров, так что нужные таблицы
периодически повторно кластеризуются.
Каждый серверный процесс (backend), выполняющий CLUSTER, будет сообщать о своем прогрессе
в представлении pg_stat_progress_cluster. См.
Раздел 3.12.4.2 для получения подробной информации.
Кластеризация секционированной таблицы кластеризует каждую из ее секций, используя
соответствующий секционированный индекс. При кластеризации секционированной
таблицы индекс не может быть опущен. CLUSTER для
секционированной таблицы не может быть выполнен внутри блока транзакции.
Кластеризовать таблицу employees на основе
её индекса employees_ind:
CLUSTER employees USING employees_ind;
Кластеризовать таблицу employees, используя тот же
индекс, что и раньше:
CLUSTER employees;
Кластеризовать все таблицы в базе данных, которые ранее были кластеризованы:
CLUSTER;
В стандарте SQL нет оператора CLUSTER.
Следующий синтаксис использовался до версии Digital Q.DataBase 17 и до сих пор поддерживается:
CLUSTER [ VERBOSE ] [table_name[ USINGindex_name] ]
Следующий синтаксис использовался до версии Digital Q.DataBase 8.3 и до сих пор поддерживается:
CLUSTERindex_nameONtable_name