SQL, Postgres OID, ¿Qué son y por qué son útiles?

161

Estoy mirando alguna creación de tabla PostgreSQL y me topé con esto:

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

Leí la documentación proporcionada por postgres y sé el concepto de identificador de objeto de OOP pero aún no entiendo,

  • ¿Por qué ese identificador sería útil en una base de datos?
  • hacer consultas más cortas?
  • ¿Cuándo debería usarse?
fabrizioM
fuente
No puedo encontrar ninguna referencia para citar en este momento, pero para su información, he oído que usar Microsoft Access como front-end para Postgres requiere la presencia de la oldcolumna del sistema .
Basil Bourque

Respuestas:

165

Básicamente, los OID le brindan una identificación integrada globalmente única para cada fila, contenida en una columna del sistema (a diferencia de una columna de espacio de usuario). Eso es útil para las tablas donde no tiene una clave primaria, tiene filas duplicadas, etc. Por ejemplo, si tiene una tabla con dos filas idénticas y desea eliminar la más antigua de las dos, puede hacerlo usando el oid columna

En mi experiencia, la característica generalmente no se usa en la mayoría de las aplicaciones respaldadas por postgres (probablemente en parte porque no son estándar), y su uso está esencialmente en desuso :

En PostgreSQL 8.1, default_with_oids está desactivado por defecto; en versiones anteriores de PostgreSQL, estaba activado por defecto.

El uso de OID en las tablas de usuario se considera obsoleto, por lo que la mayoría de las instalaciones deberían dejar esta variable deshabilitada. Las aplicaciones que requieren OID para una tabla en particular deben especificar WITH OIDS al crear la tabla. Esta variable se puede habilitar para la compatibilidad con aplicaciones antiguas que no siguen este comportamiento.

Frank Farmer
fuente
33
No se garantiza que los oids sean únicos. De los documentos: "En una base de datos grande o de larga vida, es posible que el contador se ajuste. Por lo tanto, es una mala práctica suponer que los OID son únicos, a menos que tome medidas para asegurarse de que este sea el caso".
radiospiel
8
El ajuste también implica que no necesariamente puede eliminar la anterior de dos filas basándose solo en su OID, ya que la que tiene el OID más bajo puede haber sido un ajuste.
Carl G
Los OID no son globalmente únicos, según los comentarios anteriores, ni lo fueron en 2011 cuando se escribió esta respuesta. Además, los OID son necesarios para los objetos del sistema, por lo que usar todos los OID en los contadores de filas no ayuda a la base de datos a asignar OID a nuevas tablas (para la tabla, no sus filas). Además, considere si un contador entero de 4 bytes será realmente suficiente para cada tabla de su base de datos.
FuzzyChef
Vale la pena mencionar que, en la mayoría de las implementaciones de phpPgAdmin al crear una tabla, la opción está deshabilitada como predeterminada, lo que significa que, de hecho, esta opción está en desuso.
vdegenne
3
Si no sabe para qué se utilizan los OID, probablemente no quiera usarlos.
vdegenne
16

Los OID todavía están en uso para Postgres con objetos grandes (aunque algunas personas argumentarían que los objetos grandes generalmente no son útiles de todos modos). También son utilizados ampliamente por las tablas del sistema . Son utilizados, por ejemplo, por TOAST, que almacena más de 8 KB de BYTEA (etc.) en un área de almacenamiento separada (transparente) que se usa de forma predeterminada en todas las tablas . Su uso directo asociado con las tablas de usuario "normales" es básicamente obsoleto .

El tipo oid se implementa actualmente como un entero de cuatro bytes sin signo. Por lo tanto, no es lo suficientemente grande como para proporcionar unicidad en toda la base de datos en grandes bases de datos, o incluso en grandes tablas individuales. Por lo tanto, no se recomienda utilizar la columna OID de una tabla creada por el usuario como clave principal. Los OID se utilizan mejor solo para referencias a tablas del sistema.

Aparentemente, la secuencia OID "sí" se ajusta si excede 4B 6 . Entonces, en esencia, es un contador global que puede ajustarse. Si se ajusta, puede comenzar a producirse una ralentización cuando se usa y "busca" valores únicos, etc.

Ver también https://wiki.postgresql.org/wiki/FAQ#What_is_an_OID.3F

rogerdpack
fuente
9

OID que se están eliminando

El equipo central responsable de Postgres está eliminando gradualmente los OID.

Postgres 12 elimina el comportamiento especial de las columnas OID

El uso de OID como una columna de sistema opcional en sus tablas ahora se elimina de Postgres 12. Ya no puede usar:

  • CREATE TABLE … WITH OIDS mando
  • default_with_oids (boolean) configuración de compatibilidad

El tipo de datos OIDpermanece en Postgres 12. Puede crear explícitamente una columna del tipo OID.

Después de migrar a Postgres 12 , cualquier columna del sistema opcionalmente definida oidya no será invisible por defecto. Realizar una SELECT *voluntad ahora incluirá esta columna. Tenga en cuenta que esta columna extra "sorpresa" puede romper código SQL escrito ingenuamente.

Albahaca Bourque
fuente
5

Para eliminar todos los OID de las tablas de la base de datos, puede usar este script de Linux:

Primero, inicie sesión como superusuario de PostgreSQL:

sudo su postgres

Ahora ejecute este script, cambiando YOUR_DATABASE_NAME con su nombre de base de datos:

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

Utilicé este script para eliminar todos mis OID, ya que Npgsql 3.0 no funciona con esto, y ya no es importante para PostgreSQL.

Rodrigo Boratto
fuente