web-dev-qa-db-fra.com

À propos de l'index clusterisé dans PostgreSQL

J'utilise psql pour accéder à une base de données postgres. Lors de l'affichage des métadonnées d'une table, existe-t-il un moyen de voir si un index d'une table est un index clusterisé?

J'ai entendu dire que la CLÉ PRIMAIRE d'une table est automatiquement associée à un index clusterisé, est-ce vrai?

37
twimo

Notez que PostgreSQL utilise le terme "index clusterisé" pour utiliser quelque chose de vaguement similaire et pourtant très différent de SQL Server.

Si un index particulier a été désigné comme index de clustering pour une table, alors psql's \d la commande indiquera l'index clusterisé, par exemple,

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

PostgreSQL ne nomme pas les indices comme indices de cluster par défaut. Elle n'organise pas non plus automatiquement les données de table pour qu'elles soient en corrélation avec l'index cluster, même lorsqu'elles sont ainsi nommées: la commande CLUSTER doit être utilisée pour réorganiser les données de table.

34
araqnid

Dans PostgreSQL, l'attribut cluster est conservé dans les métadonnées de l'index correspondant, plutôt que dans la relation elle-même. Il s'agit de l'attribut indisclustered dans le catalogue pg_index . Notez, cependant, que le regroupement des relations au sein de postgres est une action unique: même si l'attribut est vrai, les mises à jour de la table ne conservent pas la nature triée des données. À ce jour, la maintenance automatique du clustering de données reste un élément populaire TODO .

Il existe souvent une confusion entre les index clusterisés et intégrés , en particulier depuis le populaire les manuels utilisent des noms contradictoires, et la terminologie est à nouveau différente dans les manuels de postgres et de SQL server (pour n'en nommer que deux). Quand je parle d'un index intégré (aussi appelé index principal ou index primaire) Je veux dire celui dans lequel le les données de relation sont contenues dans les feuilles de l'index, par opposition à un index externe ou secondaire dans lequel les feuilles contiennent des entrées d'index qui pointent vers les enregistrements de la table. Le premier type est nécessairement toujours groupé. Malheureusement, postgres ne prend en charge que ce dernier type. Quoi qu'il en soit, le fait que un index intégré (primaire) est toujours groupé peut avoir fait croire que "une CLÉ PRIMAIRE d'une table est automatiquement associée à un index groupé". Les deux déclarations semblent similaires, mais sont différentes.

20
beldaz

existe-t-il un moyen de voir si un index d'une table est un index clusterisé

PostgreSQL n'a pas d'index clusterisé, vous ne pourrez donc pas les voir.

J'ai entendu dire que la CLÉ PRIMAIRE d'une table est automatiquement associée à un index clusterisé, est-ce vrai?

Non, ce n'est pas vrai (voir ci-dessus)

Vous pouvez grouper manuellement une table le long d'un index, mais ce n'est rien qui sera maintenu automatiquement (comme par exemple avec les index cluster de SQL Server).

Pour plus de détails, voir la description de la commande CLUSTER dans le manuel.

18

PostgreSQL n'a pas d'implémentation directe de l'index CLUSTER comme Microsoft SQL Server.

Référence tirée de ce blog:

Dans PostgreSQL, nous avons une commande CLUSTER similaire à Cluster Index.

Une fois que vous avez créé votre clé primaire de table ou tout autre index, vous pouvez exécuter la commande CLUSTER en spécifiant ce nom d'index pour atteindre l'ordre physique des données de table.

Lorsqu'une table est mise en cluster, elle est réorganisée physiquement en fonction des informations d'index. Le clustering est une opération unique: lorsque la table est mise à jour par la suite, les modifications ne sont pas groupées. En d'autres termes, aucune tentative n'est effectuée pour stocker des lignes nouvelles ou mises à jour en fonction de leur ordre d'index.

Syntaxe du cluster:

La première fois, vous devez exécuter CLUSTER à l'aide du nom d'index.

CLUSTER table_name USING index_name;

Cluster la table:

Une fois que vous avez exécuté CLUSTER avec Index, la prochaine fois vous ne devez exécuter que CLUSTER TABLE car il sait quel index déjà défini comme CLUSTER.

CLUSTER table_name;
11
Anvesh

Indexation de cluster

Un index de cluster signifie dire à la base de données de stocker les valeurs de fermeture réellement proches les unes des autres sur le disque. Ils peuvent identifier de manière unique les lignes de la table SQL. Chaque table peut avoir exactement un index clusterisé. Un index de cluster peut couvrir plusieurs colonnes. Par défaut, une colonne avec une clé primaire possède déjà un index cluster.

dictionnaire

Un dictionnaire lui-même une table avec un index clusterisé. Parce que toutes les données sont stockées physiquement par ordre alphabétique.


Indexation hors cluster

L'indexation non groupée est comme l'indexation simple d'un livre. Ils sont juste utilisés pour une récupération rapide des données. Pas sûr d'avoir des données uniques. Un index non clusterisé contient les clés d'index non clusterisées et chaque clé contient le pointeur d'emplacement des données. Un index de contenu de livre contient uniquement la clé d'un sujet ou d'un chapitre et l'emplacement de la page correspondant.

index du contenu du livre

Un tableau de contenu de livre se souvient simplement du nom du contenu et de son emplacement sur la page. Il n'est pas sûr que les données soient uniques. Parce que le même paragraphe ou ligne de texte ou Word peut être placé plusieurs fois.


Indexation PostgreSQL

PostgreSQL crée automatiquement des index pour PRIMARY KEY et toutes les contraintes UNIQUE d'une table. Connectez-vous à une base de données dans le terminal PostgreSQL et tapez \d table_name. Tous les index stockés seront visualisés. S'il existe, un index clusterisé sera également identifié.

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
);
"profile_pkey" PRIMARY KEY, btree (uid)
"profile_phone_key" UNIQUE CONSTRAINT, btree (phone)
"profile_username_key" UNIQUE CONSTRAINT, btree (username)
CREATE INDEX profile_index ON profile(uid, username);

Il s'agit en fait d'un index non cluster. Rendez-vous maintenant à l'index du cluster

ALTER TABLE profile CLUSTER ON profile_index;

consultez le tableau \d profile. ça montrera comme ça

                                     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)

Voir, profile_index maintenant CLUSTER

CLUSTER profile;
1
Rafiul Islam

Si vous voulez savoir si une table donnée est CLUSTERed à l'aide de SQL, vous pouvez utiliser la requête suivante pour afficher l'index utilisé (testé dans les versions Postgres 9.5 et 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;
1
seb