Peräkkäiset skannaukset ja indeksiskannaukset
Tiedä, milloin peräkkäinen skannaus riittää, milloin indeksiskannaus tarvitaan ja miten suunnittelija tekee päätöksen.
Peräkkäiset skannaukset ja indeksiskannaukset on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.
Kaksi tapaa löytää rivejä
Tietokannalla on kaksi perusstrategiaa rivien lukemiseen:
- Sequential Scan — lukee taulun jokaisen sivun
- Index Scan — käy indeksin läpi ja hakee vastaavat rivit
Milloin Sequential Scan on oikea valinta
Jos tarvitsette joka tapauksessa suurimman osan taulusta, koko taulun läpikäynti on halvempaa kuin indeksin lukeminen JA jokaisen vastaavan rivin hakeminen. Karkeasti: yli noin 10–20 % riveistä → seq scan on parempi.
Milloin Index Scan on parempi
Valikoivissa kyselyissä, jotka palauttavat vain pienen osan riveistä, indeksistä on hyötyä:
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)Index Scan ja Index-Only Scan
Joskus indeksi sisältää yksin kaikki tarvitsemanne sarakkeet, joten taulua ei tarvitse lukea. Tätä kutsutaan Index-Only Scan -haussa:
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_idxBitmap Index Scan
Kun valikoivuus on keskitasoa, PostgreSQL voi muodostaa vastaavista riveistä bittikartan ja hakea rivit sitten fyysisessä järjestyksessä — tämä on satunnaista I/O:ta nopeampaa:
EXPLAIN SELECT * FROM orders WHERE status = 'pending';
-- Bitmap Heap Scan on orders
-- Recheck Cond: (status = 'pending')
-- -> Bitmap Index Scan on orders_status_idxMiksi suunnittelija valitsee Seq Scan -haun
Yleisiä syitä:
- Suodatettavalla sarakkeella ei ole indeksiä
- Indeksiä ei voi käyttää (sarakkeessa oleva funktio, OR-lausekkeet tai tyyppien yhteensopimattomuudet)
- Odotettu rivimäärä on liian suuri, jotta indeksin käyttö kannattaisi
- Tilastot ovat vanhentuneet, joten suunnittelija arvioi valikoivuuden väärin
Indeksin käytön pakottaminen (varoen)
PostgreSQL:ssä ei voi antaa suoria vihjeitä suunnittelijalle. Sen sijaan:
- Suorittakaa ANALYZE tilastojen päivittämiseksi
- Lisätkää oikea indeksi
- Asettakaa istuntokohtaisia asetuksia:
SET enable_seqscan = off;vianmääritystä varten (ei tuotantokäyttöön)
Indeksiä hyödyntävät predikaatit
Jotta indeksistä olisi hyötyä, WHERE-ehdon on oltava "sargable" eli indeksoitua saraketta on verrattava suoraan:
-- 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.Yhdistelmäindeksin järjestys
Indeksi (a, b) auttaa kyselyissä, jotka käyttävät pelkkää a-saraketta tai ehtoa a AND b, mutta ei kyselyissä, jotka käyttävät pelkkää b-saraketta.
Indeksin koolla on merkitystä
Kapea B-tree-indeksi, jonka avaimia käytetään aktiivisesti, voi pysyä kokonaan muistissa, kun taas leveä indeksi ei välttämättä pysy. Pienemmät indeksit ovat nopeampia.
Varmistakaa suunnitelma
Kun olette lisänneet indeksin, suorittakaa EXPLAIN ANALYZE ja varmistakaa, että suunnittelija todella käyttää sitä. Jos ei käytä, selvittäkää syy.
Kertaus
Sekventiaalisen ja indeksipohjaisen haun välillä valitaan valikoivuuden perusteella.
- Valikoiva suodatus → Index Scan
- Suurin osa taulusta → seq scan
- Keskimääräiseen tilanteeseen Bitmap Scan
- Huomioikaa sargability
Pikatarkistus
Miksi PostgreSQL saattaisi valita sekventiaalisen haun olemassa olevan indeksin sijaan?
Opi SQL tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 46
- Oppitunnit
- 183
Usein kysytyt kysymykset
Onko oppitunti ”Peräkkäiset skannaukset ja indeksiskannaukset” ilmainen?
Kyllä – oppitunnin ”Peräkkäiset skannaukset ja indeksiskannaukset” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Peräkkäiset skannaukset ja indeksiskannaukset”?
Tiedä, milloin peräkkäinen skannaus riittää, milloin indeksiskannaus tarvitaan ja miten suunnittelija tekee päätöksen. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Peräkkäiset skannaukset ja indeksiskannaukset”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?
Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- EXPLAIN- ja EXPLAIN ANALYZE -tulosten tulkinta
- Peräkkäiset skannaukset ja indeksiskannaukset
- Hash-liitos, yhdistämisliitos ja sisäkkäiset silmukat
- Hitaiden kyselyiden tunnistaminen ja korjaaminen