sql >> Databasteknik >  >> RDS >> Oracle

Hur väljer och optimerar man orakelindex?

Oracle-dokumentationen har en utmärkt uppsättning överväganden för indexeringsval:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

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

Citerar:

  • Överväg att indexera nycklar som används ofta i WHERE-satser.

  • Överväg att indexera nycklar som används ofta för att sammanfoga tabeller i SQL-satser. För mer information om att optimera sammanfogningar, se avsnittet "Använda hash-kluster för prestanda".

  • Välj indexnycklar som har hög selektivitet. Selektiviteten för ett index är procentandelen rader i en tabell som har samma värde för den indexerade nyckeln. Ett indexs selektivitet är optimal om få rader har samma värde. Obs:Oracle skapar automatiskt index, eller använder befintliga index, på nycklar och uttryck för unika och primära nycklar som du definierar med integritetsbegränsningar. Indexering av kolumner med låg selektivitet kan vara till hjälp om datafördelningen är skev så att ett eller två värden förekommer mycket mindre ofta än andra värden.

  • Använd inte standard B-trädindex på nycklar eller uttryck med få distinkta värden. Sådana nycklar eller uttryck har vanligtvis dålig selektivitet och optimerar därför inte prestanda om inte de ofta valda nyckelvärdena visas mer sällan än de andra nyckelvärdena. Du kan använda bitmappsindex effektivt i sådana fall, om inte indexet ändras ofta, som i en OLTP-applikation med hög samtidighet.

  • Indexera inte kolumner som ändras ofta. UPDATE-satser som ändrar indexerade kolumner och INSERT- och DELETE-satser som ändrar indexerade tabeller tar längre tid än om det inte fanns något index. Sådana SQL-satser måste modifiera data i index såväl som data i tabeller. De genererar också ytterligare ångra och gör om.

  • Indexera inte nycklar som endast förekommer i WHERE-satser med funktioner eller operatorer. En WHERE-sats som använder en annan funktion än MIN eller MAX, eller en operator med en indexerad nyckel gör inte åtkomstvägen som använder indexet tillgänglig, förutom med funktionsbaserade index.

  • Överväg att indexera främmande nycklar med referensintegritetsbegränsningar i fall där ett stort antal samtidiga INSERT-, UPDATE- och DELETE-satser får åtkomst till de överordnade och underordnade tabellerna. Ett sådant index tillåter UPPDATERINGAR och DELETEs på den överordnade tabellen utan att dela låser den underordnade tabellen.

  • När du väljer att indexera en nyckel, överväg om prestandavinsten för frågor är värd prestandaförlusten för INSERTs, UPDATES och DELETEs och användningen av det utrymme som krävs för att lagra indexet. Du kanske vill experimentera genom att jämföra bearbetningstiderna för SQL-satserna med och utan index. Du kan mäta bearbetningstiden med SQL-spårningsfunktionen.



  1. Hur Strftime()-funktionen fungerar i SQLite

  2. Kan MySQL ersätta flera tecken?

  3. Hur man installerar sqlcmd &bcp på Ubuntu

  4. Oracle - literal matchar inte formatsträngsfel