Подтвердить что ты не робот

О кластеризованном индексе в postgres

Я использую psql для доступа к базе данных postgres. При просмотре метаданных таблицы есть ли способ увидеть, является ли индекс таблицы кластеризованным индексом?

Я слышал, что PRIMARY KEY таблицы автоматически ассоциируется с кластеризованным индексом, верно ли это?

4b9b3361

Ответ 1

Обратите внимание, что PostgreSQL использует термин "кластеризованный индекс" для использования чего-то смутно подобного и все же очень отличающегося от SQL Server.

Если определенный индекс был назначен как индекс кластеризации для таблицы, тогда команда psql \d будет указывать кластеризованный индекс, например,

Indexes:
    "timezone_description_pkey" PRIMARY KEY, btree (timezone) CLUSTER

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

Ответ 2

В PostgreSQL кластеризованный атрибут хранится в метаданных соответствующего индекса, а не в самом отношении. Это атрибут indisclustered в каталоге pg_index. Обратите внимание, однако, что кластеризация отношений в postgres является одноразовым действием: даже если атрибут имеет значение true, обновления в таблице не поддерживают отсортированный характер данных. На сегодняшний день автоматическое сохранение кластеризации данных остается популярным элементом TODO.

Часто встречаются путаницы между кластеризованными и интегрированными индексами, особенно потому, что популярные учебники используют конфликтующие имена, а терминология снова различается в руководствах postgres и SQL-сервера (чтобы назвать только два). Когда я говорю об интегрированном индексе (также называемом главным индексом или основным индексом), я имею в виду тот, в котором данные отношения содержатся в листах индекса, в отличие от внешнего или вторичного индекса, в котором листья содержат записи индекса, которые указывают к записям таблицы. Первый тип обязательно всегда кластеризуется. К сожалению postgres поддерживает только последний тип. Во всяком случае, тот факт, что интегрированный (первичный) индекс всегда кластеризован, может привести к убеждению, что "PRIMARY KEY таблицы автоматически ассоциируется с кластеризованным индексом". Эти два утверждения похожи, но отличаются друг от друга.

Ответ 3

есть ли способ увидеть, является ли индекс таблицы кластеризованным индексом

PostgreSQL не имеет кластеризованного индекса, поэтому вы не сможете их увидеть.

Я слышал, что PRIMARY KEY таблицы автоматически ассоциируется с кластеризованным индексом, верно ли это?

Нет, это не так (см. выше)

Вы можете вручную скопировать таблицу по индексу, но это ничего не будет поддерживать автоматически (например, с кластеризованными индексами SQL Server).

Подробнее см. описание команды CLUSTER в руководстве.

Ответ 4

PostgreSQL не имеет прямой реализации индекса CLUSTER, такого как Microsoft SQL Server.

Ссылка, взятая из этого блога:

В PostgreSQL у нас есть одна команда CLUSTER, которая похожа на Cluster Index.

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

Когда таблица кластеризована, она физически переупорядочивается на основе информации индекса. Кластеризация - это одноразовая операция: когда таблица впоследствии обновляется, изменения не кластеризуются. То есть не предпринимаются попытки сохранить новые или обновленные строки в соответствии с их порядком индекса.

Синтаксис кластера:

В первый раз вы должны выполнить CLUSTER, используя имя индекса.

CLUSTER table_name USING index_name;

Кластерная таблица:

Как только вы выполнили CLUSTER с индексом, в следующий раз вы должны выполнить только CLUSTER TABLE, потому что он знает, какой индекс уже определен как CLUSTER.

CLUSTER table_name;

Ответ 5

Если вы хотите узнать, поддерживает ли данная таблица CLUSTER ed с помощью SQL, вы можете использовать следующий запрос, чтобы показать используемый индекс (проверенный в версиях 9.5 и 9.6 Postgres):

SELECT
  i.relname AS index_for_cluster
FROM
  pg_index AS idx
JOIN
  pg_class AS i
ON
  i.oid = idx.indexrelid
WHERE
  idx.indisclustered
  AND idx.indrelid::regclass = 'your_table_name'::regclass;