sql >> Databáze >  >> RDS >> Oracle

Oracle:záleží na pořadí sloupců v indexu?

  1. Pokud a a b oba mají 1000 různých hodnot a jsou vždy dotazovány společně, pak na pořadí sloupců v indexu opravdu nezáleží. Ale pokud a má pouze 10 různých hodnot nebo máte dotazy, které používají pouze jeden ze sloupců, pak na tom záleží; v těchto scénářích nemusí být index použit, pokud řazení sloupců nevyhovuje dotazu.
  2. Sloupec s nejméně odlišnými hodnotami by měl být první a sloupec s nejvýraznějšími hodnotami jako poslední. To nejen maximalizuje užitečnost indexu, ale také zvyšuje potenciální zisky z komprese indexu.
  3. Datový typ a délka sloupce mají vliv na návratnost, kterou můžeme získat z komprese indexu, ale ne na nejlepší pořadí sloupců v indexu.
  4. Uspořádejte sloupce tak, aby nejméně selektivní sloupec byl první a nejselektivnější sloupec jako poslední. V případě kravaty veďte se sloupkem, u kterého je pravděpodobnější, že bude použit samostatně.

Jedinou potenciální výjimkou z 2. a 3. jsou sloupce DATE. Protože sloupce Oracle DATE obsahují prvek času, mohou mít 86 400 různých hodnot za den . Většina dotazů na datový sloupec se však obvykle zajímá pouze o prvek dne, takže ve výpočtech možná budete chtít vzít v úvahu pouze počet různých dnů. I když mám podezření, že to neovlivní relativní selektivitu v několika případech.

upravit (v reakci na komentář Nicka Pierpointa)

Dva hlavní důvody pro vedení s nejméně selektivním sloupcem jsou

  1. Komprese indexu
  2. Přeskočení čtení indexu

Oba fungují díky vědomí, že hodnota v aktuálním slotu je stejná jako hodnota v předchozím slotu. V důsledku toho můžeme maximalizovat návratnost těchto technik minimalizací počtu změn hodnoty. V následujícím příkladu A má čtyři různé hodnoty a B má šest. Dittos představují komprimovatelnou hodnotu nebo přeskočitelný blok indexu.

Least selective column leads ...

A          B
---------  -
AARDVARK   1
"          2
"          3
"          4
"          5
"          6
DIFFVAL    1
"          2
"          3
"          4
"          5
"          6
OTHERVAL   1
"          2
"          3
"          4
"          5
"          6
WHATEVER   1
"          2
"          3
"          4
"          5
"          6

Nejselektivnější sloupec vede ...

B  A
-  --------
1  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
2  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
3  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
4  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
5  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER
6  AARDVARK
"  DIFFVAL
"  OTHERVAL
"  WHATEVER

I v tomto triviálním příkladu (A, B) má 20 přeskočitelných slotů ve srovnání s 18 z (B, A) . Větší nepoměr by generoval větší návratnost investic při kompresi indexu nebo lepší užitek ze čtení s přeskočením indexu.

Stejně jako u většiny heuristik ladění musíme porovnávat pomocí skutečných hodnot a realistických objemů. Toto je rozhodně scénář, kde by zkreslení dat mohlo mít dramatický dopad na efektivitu různých přístupů.

"Myslím, že pokud máte vysoce selektivní první index, pak - z hlediska výkonu - uděláte dobře, když ho dáte na první místo."

Pokud máme vysoce selektivní sloupec, měli bychom z něj vytvořit vlastní index. Je nepravděpodobné, že by dodatečné výhody, které by přineslo zamezení operace FILTER na hrstce řádků, byly vyváženy režií údržby složeného indexu.

Vícesloupcové indexy jsou nejužitečnější, když máme:

  • dva nebo více sloupců střední selektivity,
  • které se často používají ve stejném dotazu.


  1. Řadit podle data a času v sestupném pořadí?

  2. SQL Server Trigger:Pochopení a alternativy

  3. Rozdíl mezi uživatelem a přihlášením na SQL Server

  4. Oracle SQL – Identifikujte sekvenční rozsahy hodnot