2011-01-25 3 views
23

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

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

+2

PostgreSQL не имеет кластеризованного индекса, но почему, по вашему мнению, это будет интересно? У вас есть проблема? –

+7

Нет особых проблем для решения. Просто узнайте о postgre :-) – zzhang

+0

Я бы задался вопросом, почему мои таблицы не были автоматически дефрагментации, если бы не этот вопрос –

ответ

12

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

PostgreSQL не имеет кластерный индекс, так что вы не сможете их увидеть.

Я слышал, что ПЕРВИЧНЫЙ КЛЮЧ таблицы автоматически ассоциируется с кластеризованным индексом, верно ли это?

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

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

Для получения дополнительной информации см. Описание команды CLUSTER в руководстве.

+0

Тогда можно ли использовать \ d, чтобы определить, группируется ли таблица по индексу? – zzhang

+0

'\ dS +' должен делать это, если я правильно прочитал руководство. Просто проверьте помощь и поиграйте с оптиками. –

25

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

Если определенный индекс был номинирован как кластерный индекс для таблицы, то \d команда Psql укажет кластерный индекс, например,

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

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

15

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

Существует часто путаница между кластерным и интегрированных индексов, в частности, так как популярные учебники используют конфликтующие имена, и терминология отличается снова в руководствах Postgres и SQL-сервере (чтобы назвать только два). Когда я говорить о комплексном индексе (также называемого основного индекс или первичный индексом) Я имею в виду одно, в котором данные отношения содержатся в листах индекса, в противоположности к внешнему или вторичного индекс, в котором листья содержат записи индекса, которые указывают на записи таблицы. Первый тип обязательно всегда кластеризуется. К сожалению postgres поддерживает только последний тип.Во всяком случае, тот факт, что интегрированный (первичный) индекс всегда сгруппирован,, возможно, породил веру в то, что «ПЕРВИЧНЫЙ КЛЮЧ таблицы автоматически ассоциируется с кластеризованным индексом». Оба утверждения звучат одинаково, но отличаются друг от друга.

+1

Я считаю, что SQL Server также делает первичные ключи по умолчанию кластеризованным индексом, если вы не скажете иначе, верно? Это может привести к путанице или привести к предположению, что эти два значения означают одно и то же. – Brandon

+1

Да, в соответствии с http://msdn.microsoft.com/en-us/library/ms174979.aspx «Ограничения PRIMARY KEY по умолчанию для CLUSTERED, а ограничения UNIQUE по умолчанию - NONCLUSTERED». – beldaz

2

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

Reference Taken from this Blog:

В PostgreSQL, мы имеем одну команду Кластер, который похож на кластер индекса.

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

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

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

Первый раз необходимо выполнить кластер с помощью имени индекса.

CLUSTER table_name USING index_name; 

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

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

CLUSTER table_name; 
1

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

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; 
+0

заявление sql, которое вы указали, не работает –

+0

@ DanielL.VanDenBosch, в чем была ошибка? Я только что перепроверил, что это работает для меня (и уточнил версию postgres в моем ответе). – seb