0Pricing
SQL Academy · Lekcja

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_idx

Skan 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_idx

Dlaczego 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

  1. Odczytywanie EXPLAIN i EXPLAIN ANALYZE
  2. Skanowanie sekwencyjne a skanowanie indeksu
  3. Hash Join a Merge Join a Nested Loop
  4. Identyfikowanie i naprawianie powolnych zapytań
← Powrót do SQL Academy