41

Açıklama komutunun çıktısında iki terim 'Sıra Tarama' ve 'Bitmap yığın taraması' buldum. Birisi bana bu iki tarama türü arasındaki farkın ne olduğunu söyleyebilir mi? Bu tüm tablo olmayabilir (Post taramalarda Seq Scan ve Bitmap yığın taraması arasındaki fark nedir?

+2

basitçe söylemek gerekirse, "seq [5 minik satırlar olmadığından Evet, hepsi sıralı taramaları olurdu, bu sorgu planları aptal, ama biz test biz bunu analiz Had analiz başarısız bunun nedeni] tarama "dizinleri kullanmıyor" (genellikle daha yavaş) ve diğer tüm taramalar tabloda tanımlanan dizinleri kullanmaya çalışır. – Gnudiff

cevap

65

http://www.postgresql.org/docs/8.2/static/using-explain.html Temelde, sıralı tarama gerçek satır gidiyor (ı PostgreSQL kullanıyorum) ve sıranın 1'den okumaya başlamak ve sorgu memnun edilene kadar devam Örneğin, limit durumunda

Bitmap yığın taraması, PostgreSQL'in küçük bir satır kümesi (örneğin, bir dizinden) aldığını ve yalnızca bu satırları alacağını bildirmesi anlamına gelir. Bu elbette çok daha fazla arama yapacak, bu yüzden sadece satırların küçük bir alt kümesine ihtiyaç duyduğunda daha hızlı olacaktır.

bir örnek ele alalım: Şimdi

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); 

, kolayca bir seq tarama alabilirsiniz: o onun tablonun büyük çoğunluğu kapmak için gidiyor tahmin çünkü

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) 

Bu sıralı tarama yaptım ; Bunu yapmaya çalışmak (büyük, aramaksızın okumak yerine) saçma olacaktır.

  1. bir inşa:

    Şimdi, indeks kullanabilirsiniz:

    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) 
    

    Ve nihayet, bazı bitmap işlemleri alabilirsiniz: olarak

    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) 
    

    Biz bu okuyabilir İstediğimiz satırların bitmap'i = 4. (Bitmap dizin taraması)

  2. Bir = 3 için istediğimiz satırların bitmapini oluşturun. (Bitmap indeksi taraması)
  3. Ya birlikte iki bitmap (BitmapOr)
  4. masanın (Bitmap Öbek Tarama) kadar olan satırları bakın ve emin bir = 4 veya = 3 (yeniden kontrol kon) olmak için kontrol

+1

Veya bir bitmap taraması, dizin taramalarının da bir alt kümesinde olabilir. – WolfmanDragon

+0

@derobert, "arayan" ile ne demek istiyorsun? Herhangi bir yerde herhangi bir yer bulamıyor ... – zapadlo

+1

@Zapadlo Disk aramada olduğu gibi, sıralı olarak rastgele erişim. – derobert

İlgili konular