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

Estoy viendo algo de creación de tabla PostgreSQL y me encontré con esto:

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

Leí la documentation proporcionada por postgres y conozco el concepto de identificador de objects de OOP, pero aún no entiendo,

  • ¿Por qué tal identificador sería útil en una database?
  • para hacer consultas más cortas?
  • ¿Cuándo debería usarse?

Los OID básicamente le proporcionan una identificación global única incorporada para cada fila, contenida en una columna del sistema (a diferencia de una columna de espacio de usuario). Es útil para las tablas en las que no tiene una key principal, 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 utilizando el columna oid.

En mi experiencia, la function generalmente no se utiliza en la mayoría de las aplicaciones respaldadas por Postgres (probablemente en parte porque no son estándares), y su uso es esencialmente obsoleto :

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 deben dejar esta variable desactivada. Las aplicaciones que requieren OID para una tabla particular deben especificar WITH OIDS al crear la tabla. Esta variable se puede habilitar para compatibilidad con aplicaciones antiguas que no siguen este comportamiento.

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

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

Aparentemente, la secuencia OID se "ajusta" si excede 4B 6 . Entonces, en esencia, es un contador global que puede envolver. Si se ajusta, es posible que se produzca cierta desaceleración cuando se usa y se "busca" valores únicos, etc.

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

Para eliminar todos los OID de las tablas de su database, puede usar este script de Linux:

Primero, inicie session como superusuario de PostgreSQL:

 sudo su postgres 

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

 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.