web-dev-qa-db-fra.com

SQL, OID Postgres, en quoi consistent-ils et pourquoi sont-ils utiles?

Je regarde une création de table PostgreSQL et je suis tombé sur ceci:

CREATE TABLE (
...
) WITH ( OIDS = FALSE );

J'ai lu la documentation fournie par postgres et je connais le concept d'identificateur d'objet de OOP mais je ne comprends toujours pas,

  • pourquoi un tel identifiant serait utile dans une base de données?
  • rendre les requêtes plus courtes?
  • quand doit-il être utilisé?
144
fabrizioM

Les OID vous fournissent en principe un identifiant intégré unique pour chaque ligne, contenu dans une colonne système (par opposition à une colonne d'espace utilisateur). C'est pratique pour les tables sans clé primaire, avec des lignes en double, etc. Par exemple, si vous avez une table avec deux lignes identiques et que vous voulez supprimer la plus ancienne des deux, vous pouvez le faire en utilisant oid colonne.

D'après mon expérience, la fonctionnalité est généralement inutilisée dans la plupart des applications postgres (probablement en partie parce qu'elles sont non standard), et leur utilisation est essentiellement obsolète :

Dans PostgreSQL 8.1, default_with_oids est désactivé par défaut. dans les versions précédentes de PostgreSQL, il était activé par défaut.

L'utilisation des OID dans les tables utilisateur est considérée comme obsolète. Par conséquent, la plupart des installations devraient laisser cette variable désactivée. Les applications nécessitant des OID pour une table particulière doivent spécifier WITH OIDS lors de la création de la table. Cette variable peut être activée pour assurer la compatibilité avec les anciennes applications qui ne suivent pas ce comportement.

149
Frank Farmer

Les OID sont toujours utilisés pour Postgres avec grand objets (bien que certaines personnes prétendent que les grands objets ne sont généralement pas utiles de toute façon). Ils sont également largement utilisés par tables système . Ils sont utilisés par exemple par TOAST qui stocke plus de 8KB BYTEA (etc.) dans une zone de stockage distincte (de manière transparente) qui est utilisée par défaut par toutes les tables . Leur utilisation directe associée aux tables utilisateur "normales" est fondamentalement obsolète .

Le type oid est actuellement implémenté sous la forme d'un entier non signé de quatre octets. Par conséquent, il n'est pas suffisant pour fournir une unicité à l'échelle de la base de données dans les grandes bases de données, voire dans les grandes tables individuelles. Par conséquent, il est déconseillé d'utiliser la colonne OID d'une table créée par l'utilisateur) en tant que clé primaire. Les OID sont mieux utilisés uniquement pour les références aux tables système.

Apparemment, la séquence OID "encapsule" si elle dépasse 4B 6 . Il s’agit donc d’un compteur global qui peut encapsuler. Si elle encapsule, un ralentissement peut commencer se produisant lorsqu'il est utilisé et "recherché" pour des valeurs uniques, etc.

Voir aussi https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F

13
rogerdpack

OID en cours d'élimination

L'équipe principale responsable de Postgres élimine progressivement les OID.

Postgres 12 supprime le comportement spécial des colonnes OID

L'utilisation de OID en tant que colonne système facultative sur vos tables est maintenant supprimée de Postgres 12. Vous ne pouvez plus utiliser:

  • Commande CREATE TABLE … WITH OIDS
  • default_with_oids (boolean) paramètre de compatibilité

Le type de données OID reste dans Postgres 12. Vous pouvez créer explicitement une colonne de type OID.

Après migration vers Postgres 12 , toute colonne système définie de manière facultative oid ne sera plus invisible par défaut. Effectuer un SELECT * Inclura maintenant cette colonne. Notez que cette colonne "surprise" supplémentaire peut rompre naïvement le code SQL écrit.

3
Basil Bourque

Pour supprimer tous les OID de vos tables de base de données, vous pouvez utiliser ce script Linux:

Commencez par vous connecter en tant que superutilisateur PostgreSQL:

Sudo su postgres

Maintenant, lancez ce script en changeant YOUR_DATABASE_NAME avec votre nom de base de données:

for tbl in `psql -qAt -c "select schemaname || '.' || tablename from pg_tables WHERE schemaname <> 'pg_catalog' AND schemaname <> 'information_schema';" YOUR_DATABASE_NAME` ; do  psql -c "alter table $tbl SET WITHOUT OIDS" YOUR_DATABASE_NAME ; done

J'ai utilisé ce script pour supprimer tous mes identificateurs d'objet, car Npgsql 3.0 ne fonctionne pas avec cela et qu'il n'est plus important pour PostgreSQL.

2
Rodrigo Boratto