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 numberCo 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
- MVCC i przyczyny bloatu
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE i pg_statistic
- Skanowanie wyłącznie indeksu i Visibility Map