2011-04-11 18 views
104

Busco en algún creación de la tabla PostgreSQL y me encontré con este:SQL, OID de Postgres, ¿qué son y por qué son útiles?

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

leí la documentación proporcionada por postgres y sé que el concepto de identificador de objeto de programación orientada a objetos, pero aún no capto,

  • ¿por qué tal identificador sería útil en una base de datos?
  • para hacer consultas más cortas?
  • ¿Cuándo se debe usar?

Respuesta

115

Los OID básicamente le otorgan una identificación única global 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 clave 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 característica es generalmente no utilizado en la mayoría de las aplicaciones de postgres respaldados (probablemente en parte porque son no estándar), y their use is essentially deprecated:

en PostgreSQL 8.1 default_with_oids es desactivada por defecto ; en versiones anteriores de PostgreSQL, estaba activado por defecto.

El uso de OID en las tablas de usuario se considerado obsoleto, así que la mayoría instalaciones deben dejar este variable de personas con discapacidad. Las aplicaciones que requieren OID para una tabla particular deben especificar CON OIDS al crear la tabla. Esta variable puede ser habilitada para compatibilidad con aplicaciones antiguas que no siguen este comportamiento .

+24

no se garantiza que los oids sean únicos. De los documentos: "En una base de datos grande o de larga duración, es posible que el contador se ajuste. Por lo tanto, es una mala práctica suponer que los OID son únicos, a menos que se tomen medidas para garantizar que este sea el caso". – radiospiel

+7

El ajuste también implica que no se puede eliminar necesariamente la anterior de dos filas basándose únicamente en su OID, ya que la que tiene el OID inferior puede haber sido un resumen. –

+0

Los OID no son globalmente únicos, por comentarios anteriores, ni tampoco en 2011 cuando se escribió esta respuesta. Además, los OID son necesarios para los objetos del sistema, por lo que agotar 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 para sus filas). Además, considere si un contador entero de 4 bytes va a ser suficiente para cada tabla en su base de datos. – FuzzyChef

9

de OID están todavía en uso para Postgres with gran objects (aunque algunas personas podrían argumentar grandes objetos no son generalmente útiles de todos modos). También se usan ampliamente por system tables. Se utilizan, por ejemplo, en TOAST que almacena BYTEA's de más de 8KB (etc.) en un área de almacenamiento separada (transparente) que se utiliza por defecto en todas las tablas. Su uso directo asociado con tablas de usuario "normales" es básicamente deprecated.

El tipo de oid se implementa actualmente como un entero de cuatro bytes sin signo. Por lo tanto, no es lo suficientemente grande como para proporcionar exclusividad en toda la base de datos 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 clave principal. Los OID se usan mejor solo para referencias a tablas del sistema.

Parece que la secuencia OID "does" wrap si supera 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

2

para eliminar todos los OID de las tablas de bases de datos, puede utilizar esta secuencia de comandos de Linux:

En primer lugar, está registrado como PostgreSQL superusuario:

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.

Cuestiones relacionadas