2012-09-04 44 views
5

私はさまざまなクエリをテストしています。ビットマップヒープスキャンとインデックススキャンを使用してdbを決定する方法が不思議です。ビットマップヒープスキャンとインデックススキャンはどのように決定されますか?

お客様作成インデックスcustomer_email_idx( varchar_pattern_ops);

ご覧のとおり、customersテーブル(dellstoreの例)があり、インデックスに電子メールの列を追加しています。

まずクエリはここにある:

電子メールなどの顧客から選択

* 'ITQ%@dell.com'; - >インデックススキャンを使用してクエリ

は、クエリを分析し説明ここにある:

              QUERY PLAN                
--------------------------------------------------------------------------------------------------------------------------------- 
Index Scan using customers_email_idx on customers (cost=0.00..8.27 rows=2 width=268) (actual time=0.046..0.046 rows=0 loops=1) 
    Index Cond: (((email)::text ~>=~ 'ITQ'::text) AND ((email)::text ~<~ 'ITR'::text)) 
    Filter: ((email)::text ~~ 'ITQ%@dell.com 
'::text) 
Total runtime: 0.113 ms 

他のクエリはここにある:

は、電子メールのIT%のような顧客からの選択* @ dell.com '; - ビットマップヒープスキャン

と>クエリ は、クエリを分析し説明ここにある:

              QUERY PLAN               
------------------------------------------------------------------------------------------------------------------------------ 
Bitmap Heap Scan on customers (cost=4.54..106.77 rows=2 width=268) (actual time=0.206..0.206 rows=0 loops=1) 
    Filter: ((email)::text ~~ 'IT%@dell.com 
'::text) 
    -> Bitmap Index Scan on customers_email_idx (cost=0.00..4.54 rows=29 width=0) (actual time=0.084..0.084 rows=28 loops=1) 
     Index Cond: (((email)::text ~>=~ 'IT'::text) AND ((email)::text ~<~ 'IU'::text)) 
Total runtime: 0.273 ms 

ビットマップおよびインデックススキャンが、ここで使用されているなぜあなたはこの例を説明することはできますか?

ありがとうございます..

+1

@ araqnidの回答とhttp: ://wiki.postgresql.org/images/4/45/Explaining_EXPLAIN.pdf 「インデックススキャン」を探します。キーは 'オプティマイザが選択可能なビットマップ・スキャン]です。 – dezso

+1

この質問はdba.SEにうまく収まると思います。 –

答えて

6

あなたはテーブルにどれくらいの行を持っていますか?この決定は、索引スキャンによって出力される行の割合に基づいて行われます。

テーブルの十分な割合がアクセスされる場合は、できるだけ多くのディスクアクセスがシーケンシャルであることを保証するためにビットマップインデックススキャンが使用されます。対照的に、プレーン・インデックス・スキャンは、テーブル・データへの1ページずつのランダムアクセスを行います。 (そして、アクセスが予想されるテーブルの割合が十分に高い場合、インデックスはまったく使用されず、テーブルデータ全体が順番にロードされます)

1つの問題は、テーブルからいくつの行アクセスされる予定はちょうど推定値です。しかし、あなたが想像することができるように、 'IT%'は "ITQ%"以上に一致する可能性があります(添え字はインデックススキャンの一部ではなく、最終フィルタのみです)

+0

合計行:20.000 - インデックススキャンで行が見つかりました:5 - ビットマップで見つかった行:6 – TraviJuu

関連する問題