sql >> Database teknologi >  >> RDS >> Oracle

Hvordan vælger og optimerer man orakelindekser?

Oracle-dokumentationen har et fremragende sæt overvejelser for indekseringsvalg:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

Opdatering til 19c:https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/designing-and-developing-for-performance.html#GUID-99A7FD1B-CEFD-4E91-9486- 2CBBFC2B7A1D

Citat:

  • Overvej at indeksere nøgler, der ofte bruges i WHERE-sætninger.

  • Overvej at indeksere nøgler, der ofte bruges til at forbinde tabeller i SQL-sætninger. For mere information om optimering af joinforbindelser, se afsnittet "Brug af Hash-klynger til ydeevne".

  • Vælg indeksnøgler, der har høj selektivitet. Selektiviteten af ​​et indeks er procentdelen af ​​rækker i en tabel med samme værdi for den indekserede nøgle. Et indekss selektivitet er optimal, hvis få rækker har samme værdi. Bemærk:Oracle opretter automatisk indekser eller bruger eksisterende indekser på nøglerne og udtryk for unikke og primære nøgler, som du definerer med integritetsbegrænsninger. Indeksering af kolonner med lav selektivitet kan være nyttigt, hvis datafordelingen er skæv, så en eller to værdier forekommer meget sjældnere end andre værdier.

  • Brug ikke standard B-træindekser på nøgler eller udtryk med få distinkte værdier. Sådanne nøgler eller udtryk har normalt dårlig selektivitet og optimerer derfor ikke ydeevnen, medmindre de ofte valgte nøgleværdier vises sjældnere end de andre nøgleværdier. Du kan bruge bitmap-indekser effektivt i sådanne tilfælde, medmindre indekset ændres ofte, som i en OLTP-applikation med høj samtidighed.

  • Indekser ikke kolonner, der ændres ofte. UPDATE-sætninger, der ændrer indekserede kolonner, og INSERT- og DELETE-sætninger, der ændrer indekserede tabeller, tager længere tid, end hvis der ikke var noget indeks. Sådanne SQL-sætninger skal modificere data i indekser såvel som data i tabeller. De genererer også yderligere fortryd og fortryd.

  • Indekser ikke nøgler, der kun vises i WHERE-sætninger med funktioner eller operatorer. En WHERE-sætning, der bruger en anden funktion end MIN eller MAX, eller en operator med en indekseret nøgle, gør ikke adgangsstien tilgængelig, der bruger indekset, undtagen med funktionsbaserede indekser.

  • Overvej at indeksere fremmede nøgler med referenceintegritetsbegrænsninger i tilfælde, hvor et stort antal samtidige INSERT-, UPDATE- og DELETE-sætninger får adgang til de overordnede og underordnede tabeller. Et sådant indeks tillader OPDATERINGER og SLETTER på den overordnede tabel uden at dele låse den underordnede tabel.

  • Når du vælger at indeksere en nøgle, skal du overveje, om ydeevnegevinsten for forespørgsler er ydelsestabet værd for INSERTs, UPDATEs og DELETEs og brugen af ​​den plads, der kræves til at gemme indekset. Du vil måske eksperimentere ved at sammenligne behandlingstiderne for SQL-sætningerne med og uden indekser. Du kan måle behandlingstid med SQL-sporingsfaciliteten.



  1. MySQL ACOS() Funktion – Returner Arc Cosinus for et tal

  2. Hvordan kan jeg sammenligne tid i SQL Server?

  3. MySQL CONVERT_TZ()

  4. Kontroller parametertypen for en partitionsfunktion i SQL Server (T-SQL)