sql >> Databasteknik >  >> RDS >> Oracle

Oracle:spelar kolumnordningen någon roll i ett index?

  1. Om a och b båda har 1000 distinkta värden och de frågas alltid tillsammans, då spelar ordningen på kolumner i index ingen roll. Men om a har bara 10 distinkta värden eller så har du frågor som bara använder en av kolumnerna så spelar det roll; i dessa scenarier kanske indexet inte används om kolumnordningen inte passar frågan.
  2. Kolumnen med de minst distinkta värdena borde vara först och kolumnen med de mest distinkta värdena sist. Detta maximerar inte bara användbarheten av indexet, det ökar också de potentiella vinsterna från indexkomprimering.
  3. Datatypen och längden på kolumnen har en inverkan på avkastningen vi kan få från indexkomprimering men inte på den bästa ordningen av kolumner i ett index.
  4. Ordna kolumnerna med den minst selektiva kolumnen först och den mest selektiva kolumnen sist. I fallet med en oavgjort ledning med kolonnen som är mer sannolikt att användas på egen hand.

Det enda möjliga undantaget från 2. och 3. är med DATE-kolumner. Eftersom Oracle DATE-kolumner innehåller ett tidselement kan de ha 86400 distinkta värden per dag . Men de flesta frågor i en datakolumn är vanligtvis bara intresserade av dagelementet, så du kanske bara vill ta hänsyn till antalet distinkta dagar i dina beräkningar. Även om jag misstänker att det inte kommer att påverka den relativa selektiviteten i bara en handfull fall.

redigera (som svar på Nick Pierpoints kommentar)

De två huvudsakliga anledningarna till att leda med den minst selektiva kolumnen är

  1. Indexkomprimering
  2. Index Hoppa över läsningar

Båda dessa utövar sin magi från att veta att värdet i den aktuella luckan är detsamma som värdet i den föregående luckan. Följaktligen kan vi maximera avkastningen från dessa tekniker genom att minimera antalet gånger värdet ändras. I följande exempel, A har fyra distinkta värden och B har sex. Ditos representerar ett komprimerbart värde eller ett överhoppningsbart indexblock.

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

Mest selektiva kolumnavledningar ...

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

Även i detta trivalexempel, (A, B) har 20 överhoppningsbara platser jämfört med de 18 av (B, A) . En större skillnad skulle generera större ROI på indexkomprimering eller bättre användbarhet från Index Skip-läsningar.

Som är fallet med de flesta avstämningsheuristiker måste vi jämföra med faktiska värden och realistiska volymer. Detta är definitivt ett scenario där dataförvrängning kan ha en dramatisk inverkan på effektiviteten hos olika tillvägagångssätt.

"Jag tror att om du har ett mycket selektivt första index då - ur prestationsperspektiv - så gör du klokt i att sätta det först."

Om vi ​​har en mycket selektiv kolumn bör vi bygga ett eget index för den. De ytterligare fördelarna med att undvika en FILTER-operation på en handfull rader kommer sannolikt inte att uppvägas av omkostnaderna för att upprätthålla ett sammansatt index.

Index med flera kolumner är mest användbara när vi har:

  • två eller flera kolumner med medelhög selektivitet,
  • som ofta används i samma fråga.


  1. SÄTTA NAMN utf8 i MySQL?

  2. Kan jag ansluta till SQL Server med Windows-autentisering från Java EE-webbappen?

  3. En översikt över indexändringarna i PostgreSQL 11

  4. Tidszonkonvertering i SQL-fråga