CLUSTER

Физически переупорядочивает таблицу на диске в соответствии с индексом.

Синтаксис

CLUSTER <indexname> ON <table_name>

CLUSTER [VERBOSE] <table_name> [ USING <index_name> ]

CLUSTER [VERBOSE]

Описание

Команда CLUSTER указывает Database упорядочить таблицу, указанную в параметре <table_name>, на основе индекса, указанного в параметре . Индекс должен быть уже определён для таблицы <table_name>.

Database поддерживает операции CLUSTER над таблицами с режимом добавления (append-optimized) только для B-деревьев (B-tree).

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

Когда таблица кластеризуется с помощью этой команды, Database запоминает, по какому индексу она была отсортирована. Форма CLUSTER <table_name> повторно кластеризует таблицу по тому же индексу, который использовался ранее. Вы можете использовать формы CLUSTER или SET WITHOUT CLUSTER команды ALTER TABLE, чтобы задать индекс, используемый для будущих операций кластеризации, либо очистить предыдущую настройку. Команда CLUSTER без параметров повторно кластеризует все ранее кластеризованные таблицы в текущей базе данных, которыми владеет вызывающий пользователь, или все таблицы, если команда вызвана суперпользователем. Эта форма CLUSTER не может выполняться внутри блока транзакции.

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

Параметры

  • index_name
    • Имя индекса.
  • VERBOSE
    • Выводит отчёт о ходе выполнения по мере кластеризации каждой таблицы.
  • table_name
    • Имя таблицы (опционально с указанием схемы).

Замечания

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

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

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

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

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

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

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

Примеры

Кластеризовать таблицу employees на основе индекса emp_ind:

CLUSTER emp_ind ON emp;

Кластеризовать таблицу employees с использованием того же индекса, что и ранее:

CLUSTER employees;

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

CLUSTER;

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

Оператор CLUSTER отсутствует в стандарте SQL.

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

CREATE TABLE AS, CREATE INDEX