pg index-only scans散记

pg索引上没有mvcc信息,即使select的列全是索引列,pg9.2之前,也要去表上查一次。

而pg9.2之后通过可见性映射表(visibility map)(xx_vm)。vm文件记录了一个块中的行是否对全部事务可见,如果可见,就不同访问行来判断可见性了。这种查询的执行计划被称为index-only scans。不用再去表上查一遍了。

如果对部分事务可见,部分不可见,那也会是index-only scans。这时并不是仅读索引即可了。

例子:

explainanalyze看真实执行计划,看到heap fetches9,说明从块中读了9行,这实际上是块中所有的行了,所以index-only scans没效果。

判断index-only scans的效果,主要是这个表的块有多少对所有事务可见。在pg_class中查。看到“relallvisiable”是0,所以这个index-only scans无效。

这时手动vacuum一下表,发现relallvisiable541了。

可以看到“Heap Fetches:0”,即从表的数据文件中读取的行数为0,是全部从索引中读取。

vm介绍:

为加快vacuum清理速度,并且降低对io的影响,pg8.4.1之后为每个数据文件夹了"xx_vm"文件,称为可见性映射表文件,简称VM文件。

vm文件为每个数据块存储一个标志位,用来标记块中是否存在需要清理的行。如果发现没有需要清理的行,就跳过该块的扫描。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪灵骅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值