本节介绍PolarDB PostgreSQL版(兼容Oracle)的查询机制。
SELECT
使用SELECT查询数据时,需要从磁盘中读取一个数据块到内存中,然后通过内存中数据块获取返回结果。
INSERT
当您使用INSERT插入一条数据时,具体过程如下:
- 从数据文件中读取一个数据块到内存中,并将这行数据写入这个数据块,系统生成一条INSERT的WAL日志。
- 当执行COMMIT命令后,系统会产生一条COMMIT的WAL日志。
- INSERT WAL日志和COMMIT WAL日志产生后会被立即写入磁盘,CLOG缓存记录这个事务提交成功的信息。
- 数据块中的数据通过bgwriter写入到数据文件中,同时更新CLOG文件。
UPDATE
上图中,txid表示事务号,t_xmin表示插入的事务号,t_xmax表示删除事务号,t_cid表示事务内命令的序号,t_tcid表示数据块内的偏移量,data表示实际数据存储的值。
- 事务101
左侧SQL表示在tbl表中插入一行值为0的数据,右侧表示实际的数据块存储内容。事务号为101;由于没有删除事务,所以删除事务号为0;事务内命令的序号为0;偏移量为(0,1)表示数据块的第一个偏移位置。
- 事务102事务102更新了tbl表,设置ID等于1,然后继续更新设置ID等于2并提交。
- 从右侧上半张图可以看出,删除事务号从0变成了102,表示这行数据被102事务删除了;偏移量变成了(0,2),表示指向了0号数据块的第二个偏移位置;从第二个偏移位置可以看到事务号为102,表示事务102插入了这行数据,数据存储值为1。
- 从右侧下半张图可以看出,事务号依旧是102,偏移量指向了(0,3),表示存储实际的数据为2;事务内命令的序号为1表示事务内的第二条命令进行了更新,与第二个UPDATE对应。
- 事务103
从左侧SQL语句表示执行了删除tbl表的动作,删除事务号更新为103。