postgres---OID

在 PostgreSQL 中,OID(Object Identifier,对象标识符) 是一个用于唯一标识数据库内部对象的整型数值。它是 PostgreSQL 系统目录(System Catalogs)中追踪和管理对象的核心机制。


OID 的作用

• 唯一标识数据库对象:每个表、索引、视图、函数、类型等都会被分配一个唯一的 OID。

• 系统目录的核心字段:系统表(如 pg_class、`pg_type``)通过 OID 快速定位对象。

• 隐式标识符:默认情况下,用户不需要主动操作 OID,但某些高级场景需要用到它。


OID 的存储位置

  • 系统表 pg_class:存储所有表、索引、视图等对象的 OID。

    SELECT oid, relname FROM pg_class WHERE relname = 'my_table';
    -- 输出示例:
    --   oid  | relname
    -- -------+---------
    -- 123456 | my_table
    
  • 系统表 pg_type:存储所有数据类型的 OID。

    SELECT oid, typname FROM pg_type WHERE typname = 'int4';
    -- 输出示例:
    --   oid  | typname
    -- -------+---------
    --     23 | int4
    

OID 的显式使用场景

  1. 直接引用对象
  • 通过 OID 快速访问对象:

    -- 根据 OID 查询表名
    SELECT relname FROM pg_class WHERE oid = 123456;
    
  1. 数据类型 regclass
  • 将表名转换为 OID:

    SELECT 'my_table'::regclass::oid;  -- 返回表的 OID
    
  1. 扩展和插件
  • 某些扩展(如 PostGIS)使用 OID 管理自定义类型或函数。

表的 OID 与用户数据

  1. 默认行为的变化
  • PostgreSQL 12 之前:建表时默认包含一个隐藏的 oid 列(可通过 WITHOUT OIDS 禁用)。

  • PostgreSQL 12 及之后:默认不再为表分配 OID(隐式禁用 WITHOUT OIDS)。

  1. 显式启用表的 OID
  • 建表时指定 WITH OIDS(不推荐,仅兼容旧版本):

    CREATE TABLE my_table (id SERIAL, data TEXT) WITH OIDS;
    
  • 此时表中会多出一个隐藏的 oid 列:

    SELECT oid, * FROM my_table;  -- 显示隐藏的 oid 列
    

OID 的缺点与优化

  1. 存储开销
  • 每个启用 OID 的表会多一个 4 字节的隐藏列,可能增加存储和内存开销。
  • 优化建议:默认使用 WITHOUT OIDS(现代版本已隐式禁用)。
  1. 兼容性问题
  • 旧版本迁移到新版本时,需检查是否依赖表的 OID 列。

其他类型的 OID

PostgreSQL 还有其他类型的 OID 用于不同对象:

类型描述示例系统表
OID通用对象标识符pg_class.oid
XID (Transaction ID)事务标识符(非对象)pg_stat_activity.backend_xid
TID (Tuple ID)行版本标识符(ctidctid

实际应用示例

  1. 通过 OID 快速清理表
-- 根据表名找到 OID,再通过 OID 执行操作
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE pid = (
  SELECT pid 
  FROM pg_locks 
  WHERE relation = 'my_table'::regclass::oid
);
  1. 监控对象变化
    通过 OID 追踪对象的元数据变化:
-- 记录表的 OID 和当前修改时间
SELECT oid, relname, relfilenode, relfrozenxid 
FROM pg_class 
WHERE relname = 'my_table';

总结

• OID 是 PostgreSQL 内部管理对象的唯一标识符,但对用户透明。

• 现代版本默认禁用表的 OID 列,以减少存储开销。

• 高级用法:在动态 SQL、扩展开发或系统维护时,直接操作 OID 可以提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值