Skanowanie sekwencyjne a skanowanie indeksu
Rozumieć, kiedy skanowanie sekwencyjne jest wystarczające, kiedy wymagane jest skanowanie indeksu i jak planista podejmuje tę decyzję
Skanowanie sekwencyjne a skanowanie indeksu to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.
Dwa sposoby wyszukiwania wierszy
Baza danych ma dwie podstawowe strategie odczytywania wierszy:
- Sequential Scan — odczytuje każdą stronę tabeli
- Index Scan — przechodzi po indeksie i pobiera pasujące wiersze
Kiedy skanowanie sekwencyjne jest właściwym wyborem
Jeśli i tak potrzebna jest większość tabeli, skanowanie jest tańsze niż odczytanie indeksu ORAZ pobranie każdego pasującego wiersza. W przybliżeniu: dla ponad ~10–20% wierszy wygrywa skanowanie sekwencyjne.
Kiedy wygrywa skan indeksu
W przypadku zapytań selektywnych, które zwracają niewielką część wierszy, indeks się opłaca:
EXPLAIN SELECT * FROM users WHERE id = 42;
-- Index Scan using users_pkey (cost=0.43..8.45 rows=1)
EXPLAIN SELECT * FROM users WHERE active;
-- Seq Scan on users (cost=0.00..15000.00 rows=950000)
-- (because most users are active)Skan indeksu a skan tylko indeksu
Czasami indeks zawiera wszystkie potrzebne kolumny, więc nie trzeba pobierać danych z tabeli. Jest to Index-Only Scan:
CREATE INDEX users_email_id_idx ON users(id) INCLUDE (email);
EXPLAIN SELECT email FROM users WHERE id = 42;
-- Index Only Scan using users_email_id_idxSkan bitmapowy indeksu
Przy średniej selektywności PostgreSQL może utworzyć bitmapę pasujących wierszy, a następnie pobrać je w kolejności fizycznej — szybciej niż przy losowych operacjach I/O:
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Bitmap Heap Scan on orders
-- Recheck Cond: (status = 'pending')
-- -> Bitmap Index Scan on orders_status_idxDlaczego planista wybiera skanowanie sekwencyjne
Typowe przyczyny:
- Brak indeksu dla filtrowanej kolumny
- Indeksu nie można użyć (funkcja zastosowana do kolumny, klauzule OR, niezgodne typy)
- Oczekiwana liczba wierszy jest zbyt duża, aby użycie indeksu było opłacalne
- Statystyki są nieaktualne i planista nieprawidłowo ocenia selektywność
Wymuszanie użycia indeksu (ostrożnie)
Nie można bezpośrednio podpowiedzieć PostgreSQL, którego indeksu ma użyć. Zamiast tego należy:
- Uruchomić ANALYZE, aby odświeżyć statystyki
- Dodać właściwy indeks
- Ustawić parametry sesji:
SET enable_seqscan = off;w celach diagnostycznych (nie na produkcji)
Predykaty obsługiwane przez indeks
Aby indeks był pomocny, klauzula WHERE musi być "sargable" — powinna bezpośrednio porównywać indeksowaną kolumnę:
-- GOOD:
WHERE created_at >= '2024-01-01'
-- BAD (function on the column):
WHERE date_trunc('day', created_at) = '2024-01-01'
-- BAD (cast):
WHERE created_at::DATE = '2024-01-01'
-- FIX: add a functional index, or rewrite with range.Kolejność kolumn w indeksie złożonym
Indeks na (a, b) pomaga w zapytaniach dotyczących samego a oraz a AND b, ale nie samego b.
Rozmiar indeksu ma znaczenie
Wąski indeks B-tree z często używanymi kluczami może w całości zmieścić się w pamięci, a szeroki indeks — nie. Mniejsze indeksy są szybsze.
Weryfikacja planu
Po dodaniu indeksu uruchom EXPLAIN ANALYZE, aby potwierdzić, że planista faktycznie go używa. Jeśli nie, należy sprawdzić przyczynę.
Podsumowanie
Wybór między skanowaniem sekwencyjnym a skanem indeksu zależy od selektywności.
- Selektywny filtr → skan indeksu
- Większość tabeli → skanowanie sekwencyjne
- Dla wartości pośrednich — skan bitmapowy
- Należy zwracać uwagę na właściwość sargable
Szybki test
Dlaczego PostgreSQL może wybrać skanowanie sekwencyjne zamiast istniejącego indeksu?
Często zadawane pytania
Czy lekcja „Skanowanie sekwencyjne a skanowanie indeksu” jest bezpłatna?
Tak — pełny tekst „Skanowanie sekwencyjne a skanowanie indeksu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Skanowanie sekwencyjne a skanowanie indeksu”?
Rozumieć, kiedy skanowanie sekwencyjne jest wystarczające, kiedy wymagane jest skanowanie indeksu i jak planista podejmuje tę decyzję Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Academy?
Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Skanowanie sekwencyjne a skanowanie indeksu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?
Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Odczytywanie EXPLAIN i EXPLAIN ANALYZE
- Skanowanie sekwencyjne a skanowanie indeksu
- Hash Join a Merge Join a Nested Loop
- Identyfikowanie i naprawianie powolnych zapytań