postgresql – 了解postgres解释w /位图堆/索引扫描

我有一个表w / 450万行。没有主键。该表具有列p_id,类型整数。在这个列上有一个索引,使用btree方法的idx_mytable_p_id。我做:
SELECT * FROM mytable WHERE p_id = 123456;

我运行一个解释,并看到以下输出

Bitmap Heap Scan on mytable  (cost=12.04..1632.35 rows=425 width=321)
  Recheck Cond: (p_id = 543094)
  ->  Bitmap Index Scan on idx_mytable_p_id  (cost=0.00..11.93 rows=425 width=0)
        Index Cond: (p_id = 543094)

问题:

>为什么该查询执行堆扫描,然后进行位图索引扫描?
>为什么要检查425行?为什么操作的宽度321?
>什么是12.04..1632.35和0.00..11.93的成本告诉我?

对于记录,有773行,p_id值为123456.在mytable上有38列。

谢谢!

Why is that query doing a heap scan and then a bitmap index scan?

这不是,确切。 EXPLAIN输出显示执行节点的结构,其中“更高”级别(不缩进到远)从其下的节点中拉出行。因此,当位图堆栈扫描节点去拉其第一行时,位图索引扫描运行以确定要使用的行集合,并将第一行的信息传递到堆扫描。索引扫描传递索引以确定需要读取哪些行,并且堆扫描实际上读取它们。这个想法是,通过从头到尾读取堆,而不是按照索引顺序,它将执行较少的随机访问 – 来自给定页的所有匹配的行将在该页加载时被读取,并且足够的页可以被读取以便使用更便宜的顺序访问,而不是在磁盘上来回查找。

Why is it examining 425 rows?

不是。你运行EXPLAIN,它只显示估计和选择的计划,它不真正检查行。这使得与运行EXPLAIN ANALYZE相比,EXPLAIN的值相当有限,后者实际上运行查询显示估计值和实际数字。

Why is the width of the operation 321?

显然这是mytable中的元组的大小(以字节为单位)。

What is the cost of 12.04..1632.35 and 0.00..11.93 telling me?

一个数字是从该节点返回第一行的成本;第二个数字是返回该节点的所有行的开销。记住,这些是估计。单位是抽象成本单位。绝对数意味着什么;在规划中什么事项是哪个计划具有最低的成本。如果你使用光标,第一个数字很重要;否则通常是第二个数字。 (我认为它为一个LIMIT子句插值。)

通常需要调整可配置的成本因素(如random_page_cost和cpu_tuple_cost),以准确地为您环境中的成本建模。没有这样的调整,比较成本很可能不匹配相应的运行时间,因此可能选择一个不太理想的计划。

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...