对象标识类型
类型名称 | 引用 | 描述 |
---|---|---|
oid | 任意 | 数字化的对象标识符 |
regproc | pg_proc | 函数名 |
regprocedure | pg_proc | 带参数类型的函数 |
regoper | pg_operator | 操作符名 |
regoperator | pg_operator | 带参数类型的操作符名 |
regclass | pg_class | 表名或索引名 |
regtype | pg_type | 数据类型名 |
regconfig | pg_ts_config | 全文索引配置 |
regdictionary | pg_ts_dict | 全文索引路径 |
概念
oid:各种系统表的主键,在postgresql内部使用的对象标识符。用户建表可以使用with oids创建oid,但官方不建议使用,建议oid只用于系统表。
ctid:表示数据行在它所处的表内的物理位置,ctid会随着vacuum full操作改变。ctid由两个数字组成(物理块,行号)。
xmin:标记插入数据行的事务id
xmax:标记删除数据行的事务id
cmin和cmax用于判断同一事务内的不同命令导致行版本的变化是否可见
pg修改前后的数据存储在相同结构中,分为以下几种情况:
- 新插入一行时,将新插入行的xmin填写为当前的事务ID,xmax填0
- 修改这一行时,实际上新插入一行,原数据行上xmin不变,xmax改为当前的事务ID,新数据行上的xmin填写为当前的事务ID,xmax填0
- 删除一行时,把被删除行上的xmax填写当前的事务ID
(没有修改数据行的操作,因为修改数据行,实际上就是把原数据行上的xmax标记上自己的事务ID即相当于打上删除标记,然后再新插入一条记录)
##查看标识符为1259为那张表
select 1259::regclass;
##查看系统表有哪些字段
select attrelid,attname,atttypid,attlen,attnum,attnotnull
from pg_attribute
where attrelid='t'::regclass;
ps:
attrelid='t'::regclass 等价 select oid from pg_class where relname='t';
##利用ctid删除表重复的数据
delete from tb_name as a
where a.ctid <> (select min(b.ctid) from tb_name as b where a.id=b.id)
(适用表数据比较少的情况)
delete from tb_name
where ctid = any(array(select ctid from (select row_number() over (partition by id ),ctid from tb_name) x where x.row_number >1));
(适用于表数据量比较大的情况)
资料参考来源:《PostgreSQL修炼之道从小工到专家 第2版》唐成著 机械工业出版社
仅学习非商业用途