9

さまざまなクエリをテストしていますが、dbがビットマップヒープスキャンとインデックススキャンの使用をどのように決定するのか知りたいです。

Customers(email varchar_pattern_ops);にインデックスcustomers_email_idxを作成します。

ご覧のとおり、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

ここでビットマップとインデックススキャンが使用される理由をこの例で説明できますか?

ありがとうございました..

4

1 に答える 1

8

テーブルには合計でいくつの行がありますか?決定は、インデックススキャンによって出力される行の割合に基づいています。

テーブルの十分に高い割合がアクセスされる場合は、ビットマップインデックススキャンを使用して、可能な限り多くのディスクアクセスがシーケンシャルであることを確認します。対照的に、プレーンインデックススキャンは、テーブルデータに一度に1ページずつランダムアクセスします。(また、アクセスされると予測されるテーブルの割合が十分に高い場合、インデックスはまったく使用されず、テーブルデータ全体が順番にロードされます)

1つの問題は、テーブルからアクセスされる行数の予測が単なる見積もりであるということです。ただし、ご想像のとおり、「IT%」は「ITQ%」よりも一致する可能性があります(サフィックスはインデックススキャンの一部ではなく、最後のフィルターのみであることに注意してください)

于 2012-09-04T10:35:32.550 に答える