2017-06-01 2 views
0

Les index dans PG stockent-ils un type d'ID interne de ligne ou stockent-ils la clé primaire de la ligne? Je déduis qu'il doit s'agir d'un ID de ligne interne puisque les tables ne doivent pas avoir de PK. Cependant, je ne trouve pas de réponse spécifique à cette question.Comment les index PostgreSQL référencent-ils les lignes?

Répondre

1

Chaque ligne a une "adresse" interne stockée dans la colonne système ctid (très similaire à rowid d'Oracle). Cette valeur ctid est stockée dans l'index.

Plus de détails sont dans le manuel:

Vous pouvez sélectionner la colonne si vous voulez:

select ctid, t.* 
from your_table t; 
+0

Ainsi, toute mise à jour à une ligne sera exiger une mise à jour de l'index que le ctid va changer, non? – IamIC

+1

@IamIC: uniquement si la mise à jour modifie les colonnes indexées. Sinon, Postgres peut utiliser une mise à jour "HOT" (heap-only-tuple): https://github.com/postgres/postgres/blob/master/src/backend/access/heap/README.HOT Voir aussi [this réponse] (https://dba.stackexchange.com/a/84859/1822) et [cet article du wiki Postgres] (https://wiki.postgresql.org/wiki/Index-only_scans#Interaction_with_HOT) –