W wyniku polecenia wyjaśnienia znalazłem dwa terminy "Seq Scan" i "Bitmap heap Scan". Czy ktoś może mi powiedzieć, jaka jest różnica między tymi dwoma typami skanowania? (Używam PostgreSQL)Jaka jest różnica między skanowaniem sterty a skanowaniem sterty bitmap w postgresie?
Odpowiedz
http://www.postgresql.org/docs/8.2/static/using-explain.html
Zasadniczo, sekwencyjnego skanowania idzie do rzeczywistych wierszy i zacząć czytać od wiersza 1, i dalej, aż kwerenda jest spełniony (nie może to być cała tabela, np. w przypadku limitu)
Skanowanie sterty bitmap oznacza, że PostgreSQL znalazł mały podzestaw wierszy do pobrania (np. z indeksu) i pobierze tylko te wiersze. Będzie to oczywiście miało o wiele więcej poszukiwań, więc jest szybsze tylko wtedy, gdy potrzebuje małego podzestawu wierszy.
Weźmy 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 dostać skanowanie nast:
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)
To nie sekwencyjnego skanowania, ponieważ szacuje swój zamiar porwać większość stole ; staranie się o to (zamiast dużego, bezmyślnego czytania) byłoby głupie.
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 wreszcie, możemy uzyskać pewne operacje bitmap:
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 odczytać to jako:
- Budowanie mapa bitowa żądanych wierszy dla a = 4. (Skanowanie indeksu map bitowych)
- Zbuduj bitmapę żądanych wierszy dla a = 3. (Bitmapy skanowania indeksu)
- albo dwie bitmapy razem (BitmapOr)
- Spójrz te wiersze w tabeli (bitmapy Heap Scan) i upewnij się, a = 4 lub = 3 (ponownie sprawdzić dyr)
[Tak, te plany zapytań są głupie, ale to dlatego, że nie udało się nam analizować test
Gdyby przeanalizowaliśmy ją oni, że wszystko będzie kolejne skany, ponieważ istnieje 5 maleńkie wiersze]
Skanowanie bitmapowe może być również podzbiorem skanu indeksu. – WolfmanDragon
@derobert, co masz na myśli przez "poszukiwanie"? Nie można znaleźć żadnej wzmianki o tym w dowolnym miejscu ... – zapadlo
@Zapadlo Szukam jak w poszukiwaniu dysku, np. Losowy dostęp zamiast sekwencyjnego. – derobert
- 1. Jaka jest różnica między opryskiwaniem sterty, przepełnieniem sterty, przekroczeniem sterty?
- 2. Android: jaka jest różnica między płytką a zatrzymanego sterty
- 3. Jaka jest różnica między RSS a stertą?
- 4. Co to jest "skanowanie sterty bitmap" w planie zapytania?
- 5. Jak działają silniki renderujące 2d ze skanowaniem?
- 6. Mechanizm za skanowaniem kodu QR Whatsapp Webapp
- 7. Jaka jest różnica między == a === w Verilog?
- 8. Jaka jest różnica między zarządzanej stercie i natywnej sterty w C# aplikacji
- 9. przywracania stanu sterty w całej sterty
- 10. Jaka jest różnica między $ a a $$ a w php?
- 11. Różnica między malloc a dlmalloc
- 12. Różnica między javacore, zrzutem wątku i zrzutem sterty w Websphere
- 13. Jaka jest różnica między Ember.computed.alias a Ember.binding?
- 14. Jaka jest różnica między pakietem a intencją?
- 15. Jaka jest różnica między krotką a kompresją?
- 16. Jaka jest różnica między uchwytem a wątkiem?
- 17. Jaka jest różnica między cancelBubble a stopPropagation?
- 18. Jaka jest różnica między HAVING a WHERE?
- 19. Jaka jest różnica między użytkownikiem a rolą?
- 20. Jaka jest różnica między StudlyCaps a CamelCase?
- 21. Jaka jest różnica między Const a Constant?
- 22. Jaka jest różnica między @Inject a @PersistenceContext?
- 23. Jaka jest różnica między preferredLocalization a preferredLanguage?
- 24. Jaka jest różnica między JavaBean a POJO?
- 25. Jaka jest różnica między podprocesiem.popen a podprocesią.run?
- 26. Jaka jest różnica między funkcjami a zamknięciami?
- 27. Jaka jest różnica między ramką a ramką?
- 28. Jaka jest różnica między hashowaniem a indeksowaniem?
- 29. Jaka jest różnica między UIViewController a UITableViewController
- 30. Jaka jest różnica między przyszłym a shared_future?
Mówiąc prościej „SEK scan "nie korzysta z indeksów (zwykle wolniej), a wszystkie inne skany próbują używać indeksów zdefiniowanych w tabeli. – Gnudiff