0Pricing
SQL Academy · Lekcja

Skanowanie wyłącznie indeksu i Visibility Map

Odblokowywać skanowanie wyłącznie indeksu przez tworzenie indeksów pokrywających zapytania i aktualizowanie mapy widoczności

Skanowanie wyłącznie indeksu i Visibility Map to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 4 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.

Czym jest Index-Only Scan?

Zwykle wyszukiwanie w indeksie zwraca identyfikatory wierszy (TID), po czym należy odwiedzić tabelę, aby odczytać właściwy wiersz. Index-Only Scan wykonuje zapytanie wyłącznie za pomocą indeksu — bez odwiedzania sterty. Jest znacznie szybszy.

Warunki

Index-Only Scan wymaga:

  • Wszystkie kolumny wybrane przez SELECT muszą znajdować się w indeksie
  • Strona zawierająca wiersz musi być oznaczona jako „all visible” w mapie widoczności

Mapa widoczności

Mapa bitowa dla każdej strony tabeli: ustawiony bit oznacza, że „wszystkie wiersze na tej stronie są widoczne dla wszystkich transakcji”. VACUUM ją utrzymuje. Bez niej PostgreSQL musi odwiedzić stertę, aby sprawdzić widoczność.

Przekształcanie zapytania w Index-Only Scan

Należy uwzględnić wszystkie potrzebne kolumny:

-- Query:
SELECT id, email FROM users WHERE id = 42;

-- Without an index on (id, email), only an Index Scan that visits the heap is possible.
-- With this:
CREATE INDEX users_id_email_idx ON users (id, email);
-- Or better:
CREATE INDEX users_id_email_idx ON users (id) INCLUDE (email);
-- The query can be index-only.

INCLUDE

Indeks pokrywający z kolumnami niekluczowymi (PG 11+). Kolumna jest przechowywana w liściach, ale nie jest używana do sortowania — nie wpływa na koszt wstawiania:

CREATE INDEX users_id_idx ON users(id) INCLUDE (email, full_name);

SELECT id, email, full_name FROM users WHERE id = 42;
-- Index-only scan if visibility map allows.

Dlaczego skan może nadal odwiedzać stertę

Po intensywnych zapisach mapa widoczności może być nieaktualna. Należy uruchomić VACUUM (bez FULL), aby ją odświeżyć.

VACUUM (VERBOSE) users;
-- "scanned X pages, X of which are visible"
-- More visible pages = more Index-Only Scans possible.

Weryfikowanie skanów Index-Only

Można je zobaczyć za pomocą EXPLAIN:

EXPLAIN ANALYZE
SELECT id, email FROM users WHERE id = 42;
--  Index Only Scan using users_id_email_idx on users
--    Index Cond: (id = 42)
--    Heap Fetches: 0       ← key number

Co mówią Heap Fetches

„Heap Fetches: 0” — idealnie, wszystkie dane pochodzą z indeksu. „Heap Fetches: N” — N wierszy wymagało odwiedzenia sterty (bit mapy widoczności nie jest ustawiony). Po uruchomieniu autovacuum wartość Heap Fetches zwykle spada.

Kiedy używać INCLUDE, a kiedy indeksu złożonego

  • Używać INCLUDE dla kolumn, które są tylko wybierane przez SELECT (nie są używane do filtrowania ani sortowania)
  • Używać indeksu złożonego (kluczowego), gdy kolumna służy również do filtrowania lub sortowania

INCLUDE pozwala zachować węższy indeks i przyspiesza zapisy.

Bloat indeksu szkodzi skanom Index-Only

Indeksy z dużym bloatem mają więcej stron, więc nawet skany wyłącznie po indeksie odczytują ich więcej. Należy wykonywać VACUUM indeksów i przebudowywać je, gdy bloat staje się duży.

Nie należy uwzględniać wszystkiego

Dodanie zbyt wielu kolumn do indeksu spowalnia zapisy i znacznie zwiększa jego rozmiar. Należy uwzględniać tylko najczęściej używane ścieżki odczytu.

Widoki zmaterializowane jako indeks pokrywający

Jeśli potrzebna jest wyjątkowo szybka obsługa konkretnego raportu, widok zmaterializowany wraz z indeksem jest w praktyce „indeksem pokrywającym” z dowolnymi obliczanymi kolumnami.

Podsumowanie

Index-Only Scan = najszybsza ścieżka odczytu.

  • Wszystkie wybrane kolumny muszą znajdować się w indeksie
  • INCLUDE tanio dodaje kolumny niekluczowe
  • Mapa widoczności musi wskazywać „all visible” — VACUUM utrzymuje ją w aktualnym stanie
  • EXPLAIN: celem jest Heap Fetches: 0

Szybkie sprawdzenie

W EXPLAIN widać Heap Fetches: 100,000 mimo węzła Index Only Scan. Jakie jest typowe rozwiązanie?

Często zadawane pytania

Czy lekcja „Skanowanie wyłącznie indeksu i Visibility Map” jest bezpłatna?

Tak — pełny tekst „Skanowanie wyłącznie indeksu i Visibility Map” 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 wyłącznie indeksu i Visibility Map”?

Odblokowywać skanowanie wyłącznie indeksu przez tworzenie indeksów pokrywających zapytania i aktualizowanie mapy widoczności Ć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 4 z 4.

Ile czasu zajmuje lekcja „Skanowanie wyłącznie indeksu i Visibility Map”?

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. MVCC i przyczyny bloatu
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE i pg_statistic
  4. Skanowanie wyłącznie indeksu i Visibility Map
← Powrót do SQL Academy