排它锁(Exclusive locks,X锁):被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象
共享锁(Share locks,S锁):被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加共享锁
封锁对象的大小称为封锁粒度
基于锁的并发控制机制要么延迟这一项操作,要么中止发出该操作的事务来保证可串行性。如果每一数据项的旧值副本保存在系统中,问题就可以避免。这种基于多个旧值版本的并发控制即MVCC
基于锁的并发控制机制为悲观机制:一种预防性的机制,读会阻塞写,写也会阻塞读
而把MVCC机制称为乐观机制:后验性的机制,读不阻塞写,写也不阻塞读,等到提交的时候才校验是否有冲突,由于没有锁,所以读写不会相互阻塞
在MVCC中,每一个写操作创建一个新的版本,当事务发出一个读操作时,并发控制管理器选择一个版本进行读取
在psql中数据采用堆表保存,并且MVCC的旧版本和新版本存储在同一个地方,如果更新大量数据,将会导致数据表的膨胀
使用vacuum命令或者autovacuum进程将旧版本的磁盘空间标记为可用,VACUUM没有办法把已经利用的磁盘空间释放给操作系统,VACUUM FULL命令可以回收可用的磁盘空间,但它会阻塞所有其他的操作
pg_repack是一个可以在线重建表和索引的扩展。它会在数据库中建立一个和需要清理的目标表一样的临时表,将目标表中的数据COPY到临时表,并在临时表上建立与目标表一样的索引,然后通过重命名的方式用临时表替换目标表
分区表根据非分区键查询相比普通表性能差距较大,因为这种场景分区表的执行计划会扫描所有分区
分区表根据分区键查询相比普通表性能有小幅降低,而查询分区子表性能比普通表略有提升
constraint_exclusion参数来控制优化器是否根据表上的约束来优化查询
on:所以表都通过约束优化查询
off:所以表都不通过约束优化查询
partition:只对继承表和UNION ALL子查询通过检索约束来优化查询
当往父表上查人数据时,数据会自动根据分区键路由规则插入到分区中,目前仅支持范围分区和列表分区
分区表上的索引、约束需使用单独的命令创建,目前没有办法一次性自动在所有分区上创建索引、约束
不支持定义(全局)主键,在分区表的分区上创建主键是可以的
如果UPDATE语句的新纪录不能违反当前分区键,UPDATE语句的新纪录目前不支持跨分区的情况
网友评论