О кластерном индексе в postgres - PullRequest
35 голосов
/ 25 января 2011

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

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

Ответы [ 6 ]

34 голосов
/ 25 января 2011

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

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

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

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

19 голосов
/ 17 октября 2011

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

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

16 голосов
/ 25 января 2011

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

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

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

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

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

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

10 голосов
/ 03 декабря 2016

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

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

В PostgreSQL у нас есть одна команда CLUSTER, аналогичная Cluster Index.

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

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

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

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

CLUSTER table_name USING index_name;

Объединить таблицу:

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

CLUSTER table_name;
1 голос
/ 24 февраля 2017

Если вы хотите узнать, является ли данная таблица 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 голосов
/ 29 марта 2019

Индекс кластера

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

dictionary

Сам словарь - таблица с кластеризованным индексом.Потому что все данные физически хранятся в алфавитном порядке.


Некластерная индексация

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

индекс содержания книги

Таблица содержания книги просто запоминает название содержимогои его расположение на странице.Не уверен, что данные уникальны.Поскольку один и тот же абзац, текстовая строка или слово могут быть размещены много раз.


Индексирование PostgreSQL

PostgreSQL автоматически создает индексы для PRIMARY KEY и всех UNIQUE ограничений таблицы.Войдите в базу данных в терминале PostgreSQL и введите \d table_name.Все сохраненные индексы будут визуализированы.Если существует кластерный индекс, который также будет идентифицирован.

Создание таблицы
CREATE TABLE IF NOT EXISTS profile(
    uid serial NOT NULL UNIQUE PRIMARY KEY,
    username varchar(30) NOT NULL UNIQUE,
    phone varchar(11) NOT NULL UNIQUE,
    age smallint CHECK(age>12),
    address text NULL
);
3 Индекс будет создан автоматически.Все эти индексы не кластеризованы
"profile_pkey" PRIMARY KEY, btree (uid)
"profile_phone_key" UNIQUE CONSTRAINT, btree (phone)
"profile_username_key" UNIQUE CONSTRAINT, btree (username)
Создайте наш собственный индекс с uid и именем пользователя
CREATE INDEX profile_index ON profile(uid, username);

Это на самом деле некластерный индекс.Теперь перейдите к кластерному индексу

Создание некластерного индекса для кластера
ALTER TABLE profile CLUSTER ON profile_index;

проверьте таблицу \d profile.это будет выглядеть следующим образом

                                     Table "public.profile"
  Column  |         Type          | Collation | Nullable |               Default
----------+-----------------------+-----------+----------+--------------------------------------
 uid      | integer               |           | not null | nextval('profile_uid_seq'::regclass)
 username | character varying(30) |           | not null |
 phone    | character varying(11) |           | not null |
 age      | smallint              |           |          |
 address  | text                  |           |          |
Indexes:
    "profile_pkey" PRIMARY KEY, btree (uid)
    "profile_phone_key" UNIQUE CONSTRAINT, btree (phone)
    "profile_username_key" UNIQUE CONSTRAINT, btree (username)
    "profile_index" btree (uid, username) CLUSTER
Check constraints:
    "profile_age_check" CHECK (age > 12)

Смотрите, profile_index теперь CLUSTER

Теперь, повторно кластеризуйте таблицу, чтобы таблица могла следовать роли индекса кластера
CLUSTER profile;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...