Catálogos del Sistema
PostgreSQL almacena su propio esquema en catálogos del sistema (pg_catalog). Las vistas information_schema estándar de SQL envuelven un subconjunto para portabilidad. Los operadores y la automatización deben conocer ambos: los catálogos son completos; information_schema es familiar.
Receta
-- Tablas en la base de datos actual (estilo de catálogo)
SELECT n.nspname, c.relname, pg_total_relation_size(c.oid) AS bytes
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','p','m')
AND n.nspname NOT IN ('pg_catalog','information_schema')
ORDER BY bytes DESC
LIMIT 20;Cuándo usar esto: Necesitas introspeccionar esquemas, columnas, restricciones o tamaños sin herramientas externas.
Ejemplo de Trabajo
-- Detalle de columna con tipos y nulabilidad
SELECT table_schema, table_name, column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'app' AND table_name = 'customers'
ORDER BY ordinal_position;
-- Restricciones en una tabla
SELECT conname, contype, pg_get_constraintdef(oid) AS definition
FROM pg_constraint
WHERE conrelid = 'app.customers'::regclass;Lo que esto demuestra:
information_schema.columnslista metadatos de columnas visibles para el usuario.pg_constraintalmacena definiciones CHECK, UNIQUE, PRIMARY KEY y FOREIGN KEY.pg_total_relation_sizeincluye índices y TOAST para la planificación de capacidad.
Inmersión Profunda
Catálogos Clave
| Catálogo | Contiene |
|---|---|
| pg_namespace | esquemas |
| pg_class | tablas, índices, vistas (relkind) |
| pg_attribute | columnas |
| pg_constraint | restricciones |
| pg_index | columnas de índice y banderas |
| pg_proc | funciones y procedimientos |
information_schema vs pg_catalog
information_schemafiltra objetos estándar de SQL y oculta detalles de implementación.pg_cataloges la fuente autorizada para particiones, políticas, disparadores y parámetros de almacenamiento.- Une catálogos cuando necesites OIDs,
relfilenodeoamname(método de acceso).
Consejos de Descubrimiento
- Las conversiones
regclass('app.customers'::regclass) resuelven nombres usandosearch_path. psql \d+ nombre_tablaes una envoltura delgada sobre consultas a catálogos.
Trampas Comunes
- OID se desborda en clústeres de larga duración - Los clústeres muy antiguos rara vez alcanzan esto; aún así, usa nombres en el código de la aplicación. Solución: Prefiere conversiones
regclass/regtypeen scripts de administración. information_schemaomite detalles de particiones - Los hijos de partición declarativa pueden parecer tablas ordinarias. Solución: Consultapg_inheritsypg_partitioned_table.- Gaps en
pg_attribute.attnum- Las columnas eliminadas dejan huecos; filtraattnum > 0y no eliminadas. Solución: Usainformation_schemapara listas de columnas portátiles. - Las vistas de estadísticas no son catálogos -
pg_stat_*son vistas sobre instantáneas de memoria compartida. Solución: Restablece las estadísticas conpg_stat_reset()con precaución en producción. search_pathafecta aregclass- El mismo nombre no calificado puede resolverse de manera diferente por rol. Solución: Califica el esquema en herramientas y migraciones.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Familia psql \d | Exploración interactiva | Automatización o diff de esquemas en CI |
pg_dump --schema-only | Exportación completa de DDL | Búsqueda ligera de columnas |
| Migraciones ORM | Evolución de esquemas propiedad de la aplicación | Gobernanza de DBA en múltiples servicios |
Preguntas Frecuentes
¿Puedo consultar catálogos desde cualquier base de datos?
Sí. Los catálogos describen el clúster; la mayoría de las consultas filtran a objetos de current_database().
¿Son transaccionales los cambios en los catálogos?
El DDL que cambia tablas de usuario actualiza los catálogos en la misma transacción.
¿Qué es `pg_description`?
Almacenamiento opcional de comentarios vinculado a OIDs de catálogo a través de objoid/classoid.
¿Cómo encuentro claves foráneas?
pg_constraint con contype = 'f' o information_schema.table_constraints.
¿Es `information_schema` más lento?
Capas de vista ligeramente más. Para introspección intensiva, las uniones de pg_catalog están bien.
Relacionado
- Fundamentos de PostgreSQL - primeras consultas a catálogos
- Fundamentos de Diseño de Esquemas - nombres y claves
- Transacciones DDL - actualizaciones de catálogos durante migraciones
Versiones de la Pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.