it-swarm.com.de

SQL, Postgres OIDs, Was sind sie und warum sind sie nützlich?

Ich schaue mir eine PostgreSQL-Tabellenerstellung an und bin darauf gestoßen:

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

Ich habe die Dokumentation von postgres gelesen und kenne das Konzept der Objektkennung aus OOP aber ich verstehe immer noch nicht,

  • warum wäre ein solcher Bezeichner in einer Datenbank nützlich?
  • fragen kürzer machen?
  • wann soll es angewendet werden
144
fabrizioM

OIDs geben Ihnen im Grunde eine integrierte, global eindeutige ID für jede Zeile, die in einer Systemspalte enthalten ist (im Gegensatz zu einer Benutzerbereichsspalte). Dies ist praktisch für Tabellen, bei denen Sie keinen Primärschlüssel haben, doppelte Zeilen usw. Wenn Sie beispielsweise eine Tabelle mit zwei identischen Zeilen haben und die älteste der beiden Zeilen löschen möchten, können Sie dies mit der Taste tun oid Spalte.

Nach meiner Erfahrung wird die Funktion in den meisten Anwendungen mit Postgres-Unterstützung im Allgemeinen nicht verwendet (wahrscheinlich teilweise, weil sie nicht dem Standard entsprechen) und ihre Verwendung ist im Wesentlichen veraltet :

In PostgreSQL 8.1 ist default_with_oids standardmäßig deaktiviert. In früheren Versionen von PostgreSQL war es standardmäßig aktiviert.

Die Verwendung von OIDs in Benutzertabellen wird als veraltet betrachtet. Bei den meisten Installationen sollte diese Variable deaktiviert bleiben. Anwendungen, die OIDs für eine bestimmte Tabelle benötigen, sollten WITH OIDS beim Erstellen der Tabelle angeben. Diese Variable kann für die Kompatibilität mit alten Anwendungen aktiviert werden, die diesem Verhalten nicht folgen.

149
Frank Farmer

OIDs werden immer noch für Postgres verwendet with large objects (obwohl einige Leute behaupten, dass große Objekte im Allgemeinen sowieso nicht nützlich sind). Sie werden auch häufig von Systemtabellen verwendet. Sie werden zum Beispiel von TOAST verwendet, das Bytes mit mehr als 8 KB (usw.) in einem separaten Speicherbereich (transparent) speichert, der standardmäßig von alle Tabellen . Ihre direkte Verwendung im Zusammenhang mit "normalen" Benutzertabellen ist grundsätzlich veraltet .

Der oid-Typ ist derzeit als vorzeichenlose 4-Byte-Ganzzahl implementiert. Daher ist es nicht groß genug, um eine datenbankweite Eindeutigkeit in großen Datenbanken oder sogar in großen Einzeltabellen zu gewährleisten. Daher wird davon abgeraten, die Spalte OID als Primärschlüssel einer vom Benutzer erstellten Tabelle zu verwenden. OIDs werden am besten nur für Verweise auf Systemtabellen verwendet.

Anscheinend "bricht" die OID "um", wenn sie 4B überschreitet 6 . Im Grunde ist es also ein globaler Zähler, der umbrechen kann. Wenn es umbricht, kann eine gewisse Verlangsamung beginnen Tritt auf, wenn es verwendet und nach eindeutigen Werten usw. "durchsucht" wird.

Siehe auch https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F

13
rogerdpack

OIDs werden auslaufen

Das für Postgres verantwortliche Kernteam setzt die OIDs schrittweise außer Kraft.

Postgres 12 entfernt das spezielle Verhalten von OID Spalten

Die Verwendung von OID als optionale Systemspalte in Ihren Tabellen wurde aus Postgres 12 entfernt. Sie können Folgendes nicht mehr verwenden:

  • Befehl CREATE TABLE … WITH OIDS
  • default_with_oids (boolean) Kompatibilitätseinstellung

Der Datentyp OID bleibt in Postgres 12 erhalten. Sie können explizit eine Spalte vom Typ OID anlegen.

Nach Migration auf Postgres 12 ist eine optional definierte Systemspalteoid standardmäßig nicht mehr unsichtbar. Das Ausführen eines SELECT * Schließt nun diese Spalte ein. Beachten Sie, dass diese zusätzliche "Überraschungs" -Spalte möglicherweise nicht mehr mit dem SQL-Code übereinstimmt.

3
Basil Bourque

Um alle OIDs aus Ihren Datenbanktabellen zu entfernen, können Sie dieses Linux-Skript verwenden:

Melden Sie sich zuerst als PostgreSQL-Superuser an:

Sudo su postgres

Führen Sie nun dieses Skript aus und ändern Sie YOUR_DATABASE_NAME mit Ihrem Datenbanknamen:

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

Ich habe dieses Skript verwendet, um alle meine OIDs zu entfernen, da Npgsql 3.0 damit nicht funktioniert und es für PostgreSQL nicht mehr wichtig ist.

2
Rodrigo Boratto