61

Explain コマンドの出力で、「Seq Scan」と「Bitmap heap Scan」という 2 つの用語を見つけました。この 2 種類のスキャンの違いを教えてください。(私は PostgreSql を使用しています)

4

1 に答える 1

86

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

基本的に、シーケンシャル スキャンは実際の行に移動し、行 1 から読み取りを開始し、クエリが満たされるまで続行します (制限の場合など、テーブル全体ではない可能性があります)。

ビットマップ ヒープ スキャンは、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);

これで、簡単に seq スキャンを取得できます。

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. または、2 つのビットマップを一緒に (BitmapOr)
  4. これらの行をテーブルで検索し (ビットマップ ヒープ スキャン)、a=4 または a=3 であることを確認します (cond を再確認します)。

[はい、これらのクエリ プランはばかげていますが、それは分析に失敗したためですtest。分析した場合、5 つの小さな行があるため、すべてシーケンシャル スキャンになります]

于 2009-01-04T08:23:54.073 に答える