Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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_Indexing_Postgresql 10 - Fatal编程技术网

Postgresql 执行位图索引扫描到仅索引扫描的原因?

Postgresql 执行位图索引扫描到仅索引扫描的原因?,postgresql,indexing,postgresql-10,Postgresql,Indexing,Postgresql 10,通过阅读博客文章,我了解到位图索引扫描可能优于索引扫描, 因为它批量访问表本身的页面,以获取索引中不存在的数据 然而,它仍然需要遍历索引,所以我看不出为什么当所有请求的数据都出现在索引中时,它可能比只扫描索引要好。然而,在许多情况下,Postgres似乎更喜欢位图索引扫描而不是仅索引 举另一个例子: 因此,在理解仅索引/位图索引扫描的权衡时,我缺少的是什么?在表被清空之前,它只是名义上的仅索引扫描。每个元组都必须在堆中进行验证。计划者知道这一点,因此只会相应地惩罚索引扫描。一旦表格被清空且所有页

通过阅读博客文章,我了解到位图索引扫描可能优于索引扫描, 因为它批量访问表本身的页面,以获取索引中不存在的数据

然而,它仍然需要遍历索引,所以我看不出为什么当所有请求的数据都出现在索引中时,它可能比只扫描索引要好。然而,在许多情况下,Postgres似乎更喜欢位图索引扫描而不是仅索引

举另一个例子:


因此,在理解仅索引/位图索引扫描的权衡时,我缺少的是什么?

在表被清空之前,它只是名义上的仅索引扫描。每个元组都必须在堆中进行验证。计划者知道这一点,因此只会相应地惩罚索引扫描。一旦表格被清空且所有页面都设置为“全部可见”,则计划员开始首选仅索引扫描。

直到表格被清空,它将是仅名称上的仅索引扫描。每个元组都必须在堆中进行验证。计划者知道这一点,因此只会相应地惩罚索引扫描。一旦表格被抽真空并且所有页面都设置为“全部可见”,则计划员开始首选仅索引扫描。

=真空完全分析详细样本表格;信息:清空public.sampletable信息:sampletable:在443页中找到0个可移动的、100000个不可移动的行版本详细信息:0个死行版本尚无法删除。CPU:用户:0.01秒,系统:0.00秒,运行时间:0.03秒。信息:分析public.sampletable信息:sampletable:扫描443页中的443页,包含100000个活动行和0个死行;样本中有30000行,估计总行数为100000行,但它仍然更喜欢位图索引扫描。真空完全不设置可见性贴图,只有常规真空可以设置可见性贴图。=真空完全分析详细样本表;信息:清空public.sampletable信息:sampletable:在443页中找到0个可移动的、100000个不可移动的行版本详细信息:0个死行版本尚无法删除。CPU:用户:0.01秒,系统:0.00秒,运行时间:0.03秒。信息:分析public.sampletable信息:sampletable:扫描443页中的443页,包含100000个活动行和0个死行;样本中有30000行,估计总行数为100000行,但它仍然更喜欢位图索引扫描。VACUUM FULL不设置可见性贴图,只有常规VACUUM可以设置可见性贴图。
#  INSERT INTO sampletable
        SELECT random() * 10000
        FROM generate_series(1, 100000);
# analyze sampletable;
# \d+ sampletable
                               Table "public.sampletable"
 Column |  Type  | Collation | Nullable | Default | Storage | Stats target | Description
--------+--------+-----------+----------+---------+---------+--------------+-------------
 x      | bigint |           |          |         | plain   |              |
Indexes:
    "sampletable_x_idx" btree (x)
# explain SELECT x FROM sampletable WHERE x < 10;
                                   QUERY PLAN
---------------------------------------------------------------------------------
 Bitmap Heap Scan on sampletable  (cost=5.01..234.48 rows=93 width=8)
   Recheck Cond: (x < 10)
   ->  Bitmap Index Scan on sampletable_x_idx  (cost=0.00..4.99 rows=93 width=0)
         Index Cond: (x < 10)
(4 rows)