Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Зеркалирование
Управление ресурсами
Безопасность
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Физически переупорядочивает таблицу на диске в соответствии с индексом.
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.
VERBOSEЕсли требуемые записи распределены случайным образом по диску, базе данных необходимо перемещаться по диску, чтобы найти нужные данные. Если эти записи хранятся ближе друг к другу, то выборка с диска становится более последовательной. В тех случаях, когда вы обращаетесь к отдельным строкам случайным образом, фактический порядок данных в таблице не имеет значения. Однако если вы чаще обращаетесь к некоторым данным, и существует индекс, группирующий их вместе, вы получите выгоду от использования команды 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.