CLUSTER
Физически переупорядочивает heap-таблицу на диске в соответствии с индексом. Данная операция не рекомендуется в Greengage DB.
Синтаксис
CLUSTER [VERBOSE] <indexname> ON <tablename>
CLUSTER [VERBOSE] <tablename> [ USING <index_name> ]
CLUSTER [VERBOSE]
Описание
Команда CLUSTER упорядочивает heap-таблицу на основе индекса.
Команда CLUSTER не поддерживается для append-optimized таблиц.
Кластеризация по индексу означает, что записи физически упорядочиваются на диске в соответствии с информацией индекса.
Если необходимые записи распределены по диску случайным образом, базе данных приходится выполнять поиск по всему диску для получения запрошенных записей.
Если эти записи хранятся ближе друг к другу, то извлечение данных с диска становится более последовательным.
Хорошим примером кластеризованного индекса является столбец с датой, где данные упорядочены последовательно по дате.
Запрос к определенному диапазону дат приведет к упорядоченному извлечению данных с диска, что обеспечит более быстрый последовательный доступ.
Кластеризация — это разовая операция: при последующем обновлении таблицы изменения не кластеризуются.
Система не предпринимает попыток хранить новые или обновленные строки в соответствии с их индексным порядком.
Можно периодически выполнять повторную кластеризацию, снова вызывая эту команду.
Установка параметра хранения таблицы FILLFACTOR менее 100% может помочь сохранить порядок кластеризации при обновлениях, поскольку обновленные строки остаются на той же странице, если там достаточно места.
При кластеризации таблицы с помощью этой команды Greengage DB запоминает, по какому индексу она была кластеризована.
Форма CLUSTER <tablename> повторно кластеризует таблицу по тому же индексу, по которому она была кластеризована ранее.
Вы можете использовать формы CLUSTER или SET WITHOUT CLUSTER команды ALTER TABLE, чтобы задать индекс для будущих операций кластеризации или удалить любые предыдущие настройки.
CLUSTER без параметров повторно кластеризует все ранее кластеризованные таблицы в текущей базе данных, которыми владеет вызывающий пользователь, или все таблицы, если команду вызывает суперпользователь.
Эту форму CLUSTER нельзя выполнять внутри блока транзакции.
Во время кластеризации таблицы на нее накладывается блокировка ACCESS EXCLUSIVE.
Такая блокировка предотвращает выполнение любых других операций с базой данных (как чтения, так и записи) над таблицей до завершения CLUSTER.
Параметры
| Параметр | Описание |
|---|---|
indexname |
Имя индекса |
VERBOSE |
Выводит отчет о ходе выполнения по мере кластеризации каждой таблицы |
tablename |
Имя (опционально указанное со схемой) таблицы |
Примечания
В случаях, когда вы обращаетесь к отдельным строкам таблицы случайным образом, фактический порядок данных в таблице не важен.
Однако, если вы чаще обращаетесь к одним данным, чем к другим, и существует индекс, группирующий их вместе, использование CLUSTER будет полезным.
Если вы запрашиваете диапазон проиндексированных значений из таблицы или одно проиндексированное значение, которому соответствует несколько строк, CLUSTER поможет, так как после того, как индекс определит страницу таблицы для первой подходящей строки, все остальные подходящие строки, вероятно, уже будут на той же странице таблицы, что сэкономит обращения к диску и ускорит запрос.
CLUSTER может пересортировать таблицу, используя либо сканирование индекса по указанному индексу, либо (если индекс является B-tree) последовательное сканирование с последующей сортировкой.
Команда попытается выбрать метод, который будет быстрее, основываясь на параметрах стоимости планировщика и доступной статистической информации.
При использовании сканирования индекса создается временная копия таблицы, содержащая данные таблицы в индексном порядке. Также создаются временные копии каждого индекса таблицы. Поэтому на диске необходимо свободное пространство, как минимум равное сумме размера таблицы и размеров индексов.
При использовании последовательного сканирования и сортировки также создается временный файл сортировки, поэтому пиковое требование к временному пространству может вдвое превышать размер таблицы плюс размеры индексов.
Этот метод часто быстрее метода сканирования индекса, но если требования к дисковому пространству неприемлемы, вы можете отключить этот выбор, временно установив параметр конфигурации enable_sort в off.
Перед кластеризацией рекомендуется установить параметр конфигурации maintenance_work_mem в достаточно большое значение (но не больше объема ОЗУ, который вы можете выделить для операции CLUSTER).
Поскольку оптимизатор запросов записывает статистику об упорядочивании таблиц, рекомендуется запустить ANALYZE для кластеризованной таблицы.
В противном случае планировщик может сделать неправильный выбор планов запросов.
Поскольку CLUSTER запоминает, какие индексы кластеризованы, вы можете вручную кластеризовать нужные таблицы в первый раз, а затем настроить скрипт периодического обслуживания, запускающий CLUSTER без параметров, чтобы нужные таблицы периодически перекластеризовывались.
Примеры
Кластеризовать таблицу employees на основе ее индекса emp_ind:
CLUSTER emp_ind ON employees;
Кластеризовать большую таблицу, пересоздав ее и загрузив в правильном индексном порядке:
CREATE TABLE newtable AS SELECT * FROM table ORDER BY column;
DROP table;
ALTER TABLE newtable RENAME TO table;
CREATE INDEX column_ix ON table (column);
VACUUM ANALYZE table;
Совместимость
В стандарте SQL нет оператора CLUSTER.