sql >> Database >  >> RDS >> Oracle

Hoe orakelindexen kiezen en optimaliseren?

De Oracle-documentatie bevat een uitstekende reeks overwegingen voor indexeringskeuzes:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

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

Citaat:

  • Overweeg het indexeren van sleutels die vaak worden gebruikt in WHERE-clausules.

  • Overweeg het indexeren van sleutels die vaak worden gebruikt om tabellen in SQL-instructies samen te voegen. Zie de sectie "Hashclusters gebruiken voor prestaties" voor meer informatie over het optimaliseren van joins.

  • Kies indexsleutels met een hoge selectiviteit. De selectiviteit van een index is het percentage rijen in een tabel met dezelfde waarde voor de geïndexeerde sleutel. De selectiviteit van een index is optimaal als enkele rijen dezelfde waarde hebben. Opmerking:Oracle maakt automatisch indexen of gebruikt bestaande indexen voor de sleutels en expressies van unieke en primaire sleutels die u definieert met integriteitsbeperkingen. Het indexeren van kolommen met een lage selectiviteit kan handig zijn als de gegevensverdeling scheef is, zodat een of twee waarden veel voorkomen minder vaak dan andere waarden.

  • Gebruik geen standaard B-tree-indexen voor sleutels of uitdrukkingen met weinig verschillende waarden. Dergelijke sleutels of uitdrukkingen hebben meestal een slechte selectiviteit en optimaliseren daarom de prestaties niet, tenzij de vaak geselecteerde sleutelwaarden minder vaak voorkomen dan de andere sleutelwaarden. In dergelijke gevallen kunt u bitmapindexen effectief gebruiken, tenzij de index vaak wordt gewijzigd, zoals in een OLTP-toepassing met hoge gelijktijdigheid.

  • Indexeer geen kolommen die vaak worden gewijzigd. UPDATE-instructies die geïndexeerde kolommen wijzigen en INSERT- en DELETE-instructies die geïndexeerde tabellen wijzigen, duren langer dan wanneer er geen index zou zijn. Dergelijke SQL-instructies moeten zowel gegevens in indexen als gegevens in tabellen wijzigen. Ze genereren ook extra ongedaan maken en opnieuw uitvoeren.

  • Indexeer geen sleutels die alleen in WHERE-clausules voorkomen met functies of operators. Een WHERE-component die een andere functie dan MIN of MAX gebruikt, of een operator met een geïndexeerde sleutel, maakt het toegangspad dat de index gebruikt niet beschikbaar, behalve bij functiegebaseerde indexen.

  • Overweeg het indexeren van externe sleutels van referentiële integriteitsbeperkingen in gevallen waarin een groot aantal gelijktijdige INSERT-, UPDATE- en DELETE-instructies toegang krijgen tot de bovenliggende en onderliggende tabellen. Zo'n index staat UPDATE's en DELETE's toe op de bovenliggende tabel zonder de onderliggende tabel te vergrendelen.

  • Wanneer u ervoor kiest een sleutel te indexeren, moet u overwegen of de prestatiewinst voor query's het prestatieverlies voor INSERT's, UPDATE's en DELETE's en het gebruik van de ruimte die nodig is om de index op te slaan waard is. U kunt experimenteren door de verwerkingstijden van de SQL-statements met en zonder indexen te vergelijken. U kunt de verwerkingstijd meten met de SQL-traceerfunctie.



  1. Een relatie maken in MySQL Workbench

  2. Redenen om Access-apps om te zetten in webgebaseerde apps

  3. Kun je een alias gebruiken in de WHERE-clausule in mysql?

  4. Verbinding maken met een database met behulp van de Workbench MySQL-client