sql >> Database >  >> RDS >> Database

Voorbeeld van het verbeteren van queryprestaties met indexen

In dit artikel bekijken we hoe een index de prestaties van zoekopdrachten kan verbeteren.

Inleiding

Indexen in Oracle en andere databases zijn objecten die verwijzingen naar gegevens in andere tabellen opslaan. Ze worden gebruikt om de queryprestaties te verbeteren, meestal de SELECT-instructie.

Ze zijn geen "zilveren kogel" - ze lossen prestatieproblemen niet altijd op met SELECT-instructies. Ze kunnen echter zeker helpen.

Laten we dit bij een bepaald voorbeeld bekijken.

Voorbeeld

Voor dit voorbeeld gaan we een enkele tabel gebruiken met de naam Klant die kolommen bevat zoals ID, Voornaam, Achternaam, maximale kredietwaarde, waarde voor aanmaakdatum en andere kolommen die we niet zullen gebruiken.

SELECT customer_id,first_name,last_name, max_credit, created_date
FROM customer;

Hier is een voorbeeld van de tabel.

[tabel id=38 /]

Nu gaan we het volgende vinden:

  • Wie van de klanten is op dezelfde datum als de eerste klanten aan de tafel toegevoegd
  • Klanten gefilterd op achternaam in oplopende volgorde
  • Geef de klant-ID, voornaam, achternaam, maximaal tegoed en aanmaakdatum weer

Maak hiervoor de volgende query:

SELECT customer_id,
first_name,
last_name,
max_credit,
created_date
FROM customer
WHERE created_date = (
     SELECT MIN(created_date)
     FROM customer
)
ORDER BY last_name;

De uitvoer ziet er als volgt uit:

[tabel id=39 /]

Het toont de gegevens die we willen.

Prestaties voordat index is toegepast

Laten we nu eens kijken naar het uitlegplan voor deze query. Ik heb dit verkregen door EXPLAIN PLAN FOR uit te voeren voor de SELECT-instructie en de volgende opdracht:

SELECT * FROM TABLE(dbms_xplan.display);

U kunt ook een vergelijkbaar uitvoerresultaat krijgen met de functie Plan uitleggen in uw IDE.

We kunnen zien dat het een Table Access Full uitvoert op twee punten, namelijk in de subquery en in de buitenste query. Dit komt omdat er geen indexen in de tabel zijn die moeten worden gebruikt.

Het kost 2934. Toen ik het uitvoerde, haalde de query 785 rijen op in 1,9 seconden. Het lijkt misschien snel, maar dit is slechts een voorbeeld dat we kunnen verbeteren. Query's in echte systemen kunnen veel langer duren.

Een manier waarop we de prestaties van deze query kunnen verbeteren, is door een index toe te voegen aan de kolom created_date. Deze kolom wordt zowel in de WHERE-clausule van de buitenste vraag als in de MIN-functie van de binnenste vraag gebruikt.

Index toevoegen

We kunnen een index aan deze tabel toevoegen om de queryprestaties te verbeteren. Deze index wordt opgeslagen in de kolom created_date zodat de code er als volgt uit kan zien:

CREATE INDEX idx_cust_cdate
ON customer (created_date);

Nu wordt de index alleen in deze kolom gemaakt. Het zou ons een prestatieverbetering in onze zoekopdracht moeten geven, maar we zullen het eerst moeten controleren.

We hebben een b-tree-index gemaakt, wat waarschijnlijk alles is wat we in deze kolom nodig hebben. We zullen het binnenkort bevestigen in het uitlegplan. Ik heb een handleiding geschreven over Oracle-indexen, inclusief hoe u weet welk indextype moet worden gebruikt, evenals tal van andere waardevolle informatie.

Prestaties na index toegevoegd

Laten we het uitlegplan opnieuw uitvoeren voor deze vraag.

We kunnen zien dat er bij de laatste stap een index is gebruikt. Het laat zien dat een volledige scan is uitgevoerd met de idx_cust_cdate-index, die we zojuist hebben gemaakt.

Het toont ook een totale kostprijs van 1472 en haalt de 785 records in 0,9 seconden.

De runtime is slechts licht verbeterd (van 1,9 naar 0,9 seconden), maar dat is een verbetering van ongeveer 50% door alleen de index aan deze kleine dataset toe te voegen.

Zoals eerder vermeld, zullen echte query's ingewikkelder zijn dan deze en zal het meer tijd kosten om te worden uitgevoerd. Maar dit is een voorbeeld van hoe een index het queryplan en de queryruntime kan verbeteren.


  1. Ondersteunt uw Salesforce-stuurprogramma bulkacties?

  2. Hoe rond je af op de dichtstbijzijnde X minuten met PL/pgSQL?

  3. SQL Natural Join

  4. jsonb_set() gebruiken voor het bijwerken van een specifieke jsonb-arraywaarde