Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 什么是索引扫描中的可见性检查_Postgresql - Fatal编程技术网

Postgresql 什么是索引扫描中的可见性检查

Postgresql 什么是索引扫描中的可见性检查,postgresql,Postgresql,我正在Postgres中查找查询优化 我不明白这种说法: 索引扫描涉及随机磁盘访问,并且仍然必须读取底层数据块以进行可见性检查 这里的“可见性检查”是什么意思?PostgreSQL使用一种称为多版本并发控制的技术来管理对数据的并发访问。在插入数据的事务提交之前,数据不可见。在其他情况下,对于其他事务,数据会被默默地忽略,因此它们看不到数据(在极少数情况下,显式锁或更高的隔离级别除外) 这意味着PostgreSQL必须检查实际行的事务id,以确保它们对所有事务都可见。现在,9.2(iirc)和更高

我正在Postgres中查找查询优化

我不明白这种说法: 索引扫描涉及随机磁盘访问,并且仍然必须读取底层数据块以进行可见性检查


这里的“可见性检查”是什么意思?

PostgreSQL使用一种称为多版本并发控制的技术来管理对数据的并发访问。在插入数据的事务提交之前,数据不可见。在其他情况下,对于其他事务,数据会被默默地忽略,因此它们看不到数据(在极少数情况下,显式锁或更高的隔离级别除外)


这意味着PostgreSQL必须检查实际行的事务id,以确保它们对所有事务都可见。现在,9.2(iirc)和更高版本允许PostgreSQL在页面中的所有元组都可见时跳过此检查。但是,否则它必须检查每行。

IIRC可见性映射实际上显示页面中的所有元组是否对所有事务都可见。因此,基本上,如果一个页面只包含所有当前事务之前的数据,那么就不需要检查其可见性。如果你改变了页面上的一行,那么整个页面的标志就没有设置。所以,如果我理解的话。有一些页面是以前的索引。在随后的索引扫描期间,可能已经修改了预先存在的索引捕获的某些行,但尚未提交和重新索引。如果这是怀疑,这意味着所有索引都可能不可靠,需要通过访问硬盘进行可见性检查。由于效率低下,我很肯定情况并非如此。因此,我仍然不确定何时进行此可见性检查,何时不需要此检查。