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

前端之家收集整理的这篇文章主要介绍了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),以准确地为您环境中的成本建模。没有这样的调整,比较成本很可能不匹配相应的运行时间,因此可能选择一个不太理想的计划。

原文链接:https://www.f2er.com/postgresql/193498.html

猜你在找的Postgre SQL相关文章