it-swarm-eu.dev

Je složený index také vhodný pro dotazy v prvním poli?

Řekněme, že mám tabulku s poli A a B. Pravidelně zadávám dotazy na A + B, takže jsem vytvořil složený index na (A,B). Byly by dotazy na pouze A také plně optimalizovány složeným indexem?

Navíc jsem vytvořil index na A, ale Postgres stále používá složený index pro dotazy pouze na A. Pokud je předchozí odpověď kladná, myslím, že na tom opravdu nezáleží, ale proč vybere složený index ve výchozím nastavení, pokud je k dispozici jediný index A?

93
Luciano

To určitě je. Podrobně jsme o tom diskutovali v rámci této související otázky:

Místo je přiděleno v násobcích MAXALIGN, což je obvykle 8 bajtů v 64bitovém OS nebo (mnohem méně obyčejné) 4 bajty v 32bitovém OS. Pokud si nejste jisti, zaškrtněte pg_controldata . Závisí také na datových typech indexovaných sloupců (některé vyžadují vyrovnání výplně) a skutečném obsahu.

Index na, řekněme, dvou sloupcích integer (každý 4 bajty) obvykle skončí stejně velký jako index pouze na jednom, kde jsou další 4 bajty ztraceny kvůli vyrovnání výplně.

V takovém případě opravdu neexistuje žádná nevýhoda pro plánovač dotazů, který by používal index na (a,b) - ve srovnání s indexem pouze (a). Obecně je výhodné, aby více dotazů používalo stejný index. Pravděpodobnost, že bude (nebo její části) umístěna v (rychlé) mezipaměti, se při sdílení zvyšuje.

Pokud již udržujete index na (a,b), pak nemá smysl vytvářet další index pouze na (a) - pokud není podstatně menší. Totéž platí není pravda pro (b,a) vs. (a). Pro více informací klikněte na odkaz v prvním řádku.

Z opačného směru, když potřebujete další index, jako je index na (a,b), pak zvažte přetažení existujícího indexu na pouhých (a) - Pokud možno. Často to není možné, protože to je index omezení PK nebo UNIQUE. Od Postgresu 11 se můžete zbavit pouhým připojením b k definici omezení s klauzulí INCLUDE. Podrobnosti v manuálu.

Nebo vytvořte nový index na (b,a) místo toho pokrývat dotazy pouze b navíc. Pouze u podmínek rovnosti nezáleží na pořadí indexových výrazů v indexech bez obsahu. Učiní to však, když zahrnuje podmínky rozsahu. Vidět:

Existují potenciální nevýhody pro zahrnutí dalších sloupců do indexu, i když to používá pouze místo jinak ztracené kvůli vyrovnání výplně:

  • Kdykoli je aktualizován další sloupec, index nyní potřebuje také aktualizaci, což by mohlo zvýšit náklady na operace zápisu a vytvořit další indexování.
  • Aktualizace HOT (Heap Only Tuple) v tabulce nejsou možné, pokud se jedná o jakýkoli sloupec indexu.

Více o HOT aktualizacích:

Jak měřit velikosti objektů:

92
Erwin Brandstetter

Podle vaší otázky máte tabulku s poli A a B. Pokud máte dotaz:

SELECT * FROM [YOUR TBL]
WHERE A='XXXX'

Optimalizátor vybere složený index, aby se zabránilo extrakci náhodného přístupu!

3
BongSey