Ř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
?
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ě:
Více o HOT aktualizacích:
Jak měřit velikosti objektů:
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!