并发访问控制
与事务型数据库系统通过锁机制来控制并发访问的机制不同,GPDB(与PostgreSQL
一样)使用多版本控制(Multiversion Concurrency Control/MVCC)保证数据一致性。这
意味着在查询数据库时,每个事务看到的只是数据的快照,其确保当前的事务不会
看到其他事务在相同记录上的修改。据此为数据库的每个事务提供事务隔离。
MVCC以避免给数据库事务显式锁定的方式,最大化减少锁争用以确保多用户环境
下的性能。在并发控制方面,使用MVCC而不是使用锁机制的最大优势是,MVCC对
查询(读)的锁与写的锁不存在冲突,并且读与写之间从不互相阻塞。
一样)使用多版本控制(Multiversion Concurrency Control/MVCC)保证数据一致性。这
意味着在查询数据库时,每个事务看到的只是数据的快照,其确保当前的事务不会
看到其他事务在相同记录上的修改。据此为数据库的每个事务提供事务隔离。
MVCC以避免给数据库事务显式锁定的方式,最大化减少锁争用以确保多用户环境
下的性能。在并发控制方面,使用MVCC而不是使用锁机制的最大优势是,MVCC对
查询(读)的锁与写的锁不存在冲突,并且读与写之间从不互相阻塞。
空间回收
libo=# vacuum test;
VACUUM
VACUUM
VACUUM命令还会收集表级别的统计信息,如记录数、占用磁盘页面数,所以在
装载数据之后对全表执行VACUUM是有必要的,这同样适用AO表
装载数据之后对全表执行VACUUM是有必要的,这同样适用AO表
查询分析:
libo=# explain select * from t where id=1;
QUERY PLAN
----------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..1.01 rows=1 width=8)
-> Seq Scan on t (cost=0.00..1.01 rows=1 width=8)
Filter: id = 1
(3 rows)
libo=# vacuum t;
VACUUM
libo=# explain select * from t where id=1;
QUERY PLAN
QUERY PLAN
----------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..1.01 rows=1 width=8)
-> Seq Scan on t (cost=0.00..1.01 rows=1 width=8)
Filter: id = 1
(3 rows)
libo=# vacuum t;
VACUUM
libo=# explain select * from t where id=1;
QUERY PLAN