gpt4 book ai didi

optimization - postgres中的Seq Scan和Bitmap堆扫描有什么区别?

转载 作者:行者123 更新时间:2023-11-29 11:06:05 28 4
gpt4 key购买 nike

在解释命令的输出中,我发现了两个术语“Seq Scan”和“Bitmap heap Scan”。有人能告诉我这两种扫描有什么区别吗? (我正在使用 PostgreSql)

最佳答案

http://www.postgresql.org/docs/8.2/static/using-explain.html

基本上,顺序扫描会到实际的行,并从第 1 行开始读取,并继续直到满足查询(这可能不是整个表,例如,在 limit 的情况下)

位图堆扫描意味着 PostgreSQL 已经找到一小部分行来获取(例如,从索引中获取),并且将只获取这些行。这当然会有更多的搜索,因此只有当它需要一小部分行时才会更快。

举个例子:

create table test (a int primary key, b int unique, c int);
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5);

现在,我们可以轻松地进行序列扫描:

explain select * from test where a != 4

QUERY PLAN
---------------------------------------------------------
Seq Scan on test (cost=0.00..34.25 rows=1930 width=12)
Filter: (a <> 4)

它进行了顺序扫描,因为它估计会占用表的绝大部分;试图这样做(而不是大量、漫无目的的阅读)是愚蠢的。

现在,我们可以使用索引:

explain select * from test where a = 4 ;
QUERY PLAN
----------------------------------------------------------------------
Index Scan using test_pkey on test (cost=0.00..8.27 rows=1 width=4)
Index Cond: (a = 4)

最后,我们可以得到一些位图操作:

explain select * from test where a = 4 or a = 3;
QUERY PLAN
------------------------------------------------------------------------------
Bitmap Heap Scan on test (cost=8.52..13.86 rows=2 width=12)
Recheck Cond: ((a = 4) OR (a = 3))
-> BitmapOr (cost=8.52..8.52 rows=2 width=0)
-> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0)
Index Cond: (a = 4)
-> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0)
Index Cond: (a = 3)

我们可以这样理解:

  1. 为 a=4 构建我们想要的行的位图。 (位图索引扫描)
  2. 为 a=3 构建我们想要的行的位图。 (位图索引扫描)
  3. 或者两个位图放在一起(BitmapOr)
  4. 在表中查找这些行(位图堆扫描)并检查以确保 a=4 或 a=3(重新检查条件)

[是的,这些查询计划很愚蠢,但那是因为我们没有分析test 如果我们分析它,它们都是顺序扫描,因为有 5 个小行]

关于optimization - postgres中的Seq Scan和Bitmap堆扫描有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/410586/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com