PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jaka jest różnica między skanowaniem sekwencyjnym a skanowaniem sterty bitmapowej w postgresie?

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

Zasadniczo skanowanie sekwencyjne przechodzi do rzeczywistych wierszy i zaczyna czytać od wiersza 1 i kontynuuje, aż zapytanie zostanie spełnione (może to nie być cała tabela, np. w przypadku limitu)

Skanowanie sterty bitmapowej oznacza, że ​​PostgreSQL znalazł mały podzbiór wierszy do pobrania (np. z indeksu) i będzie pobierał tylko te wiersze. Będzie to oczywiście miało znacznie więcej poszukiwań, więc jest szybsze tylko wtedy, gdy potrzebuje małego podzbioru wierszy.

Weź przykład:

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

Teraz możemy łatwo uzyskać seq scan:

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)

Zrobił skan sekwencyjny, ponieważ szacuje, że zdobędzie większość stołu; próba zrobienia tego (zamiast dużej, beznadziejnej lektury) byłaby głupia.

Teraz możemy użyć indeksu:

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)

I na koniec możemy uzyskać kilka operacji bitmapowych:

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)

Możemy to przeczytać jako:

  1. Zbuduj mapę bitową wierszy, które chcemy dla a=4. (Skanowanie indeksu mapy bitowej)
  2. Zbuduj bitmapę wierszy, które chcemy dla a=3. (Skanowanie indeksu mapy bitowej)
  3. Lub dwie bitmapy razem (BitmapOr)
  4. Sprawdź te wiersze w tabeli (Skanowanie sterty bitmapy) i upewnij się, że a=4 lub a=3 (sprawdź ponownie warunki)

[Tak, te plany zapytań są głupie, ale to dlatego, że nie przeanalizowaliśmy test Gdybyśmy to przeanalizowali, wszystkie byłyby skanami sekwencyjnymi, ponieważ jest 5 małych wierszy]




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSql WSTAW Z WYBRANEGO ID POWRACAJĄCEGO

  2. Zmiana nazwy klucza hstore w PostgreSQL 9.2

  3. Metapolecenia w Psycopg2 - \d nie działa

  4. Tabele tymczasowe PostgreSQL

  5. Wartość Auto-Incremented nie działa w PostgreSQL podczas korzystania z EntityFramework Core