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

Hvordan bruger man Explain Plan til at optimere forespørgsler?

Jeg går også ud fra, at du bruger Oracle. Og jeg anbefaler også, at du tjekker forklaringsplan-websiden, for det første. Der er meget til optimering, men det kan læres.

Et par tips følger:

For det første, når nogen beder dig om at optimere, leder de næsten altid efter acceptabel ydeevne snarere end ultimativ ydeevne. Hvis du kan reducere en forespørgsels køretid fra 3 minutter ned til 3 sekunder, skal du ikke svede for at reducere den til 2 sekunder, før du bliver bedt om det.

For det andet skal du foretage en hurtig kontrol for at sikre, at de forespørgsler, du optimerer, er logisk korrekte. Det lyder absurd, men jeg kan ikke fortælle dig, hvor mange gange jeg er blevet spurgt til råds om en langsomt kørende forespørgsel, kun for at finde ud af, at den af ​​og til gav forkerte svar! Og som det viser sig, viste fejlretning af forespørgslen sig ofte også at fremskynde den.

Se især efter udtrykket "Cartesian Join" i forklaringsplanen. Hvis du ser det der, er chancerne meget gode for, at du har fundet en utilsigtet kartesisk join. Det sædvanlige mønster for en utilsigtet kartesisk joinforbindelse er, at FROM-udtrykket viser tabeller adskilt med komma, og joinbetingelserne er i WHERE-udtrykket. Bortset fra at en af ​​joinbetingelserne mangler, så Oracle ikke har andet valg end at udføre en kartesisk joinforbindelse. Med store borde er dette en ydeevnekatastrofe.

Det er muligt at se en Cartesian Join i forklaringsplanen, hvor forespørgslen er logisk korrekt, men jeg forbinder dette med ældre versioner af Oracle.

Se også efter det ubrugte sammensatte indeks. Hvis den første kolonne i et sammensat indeks ikke bruges i forespørgslen, kan Oracle bruge indekset ineffektivt eller slet ikke. Lad mig give et eksempel:

Forespørgslen var:

select * from customers    
where
     State = @State
     and ZipCode = @ZipCode

(DBMS var ikke Oracle, så syntaksen var anderledes, og jeg har glemt den originale syntaks).

Et hurtigt kig på indekserne afslørede et indeks over kunder med kolonnerne (Land, stat, postnummer) i den rækkefølge. Jeg ændrede forespørgslen til at læse

  select * from customers
   where Country = @Country
      and State = @State
      and ZipCode = @ZipCode

og nu kørte den på cirka 6 sekunder i stedet for cirka 6 minutter, fordi optimizeren med fordel kunne bruge indekset. Jeg spurgte applikationsprogrammørerne, hvorfor de havde udeladt landet fra kriterierne, og dette var deres svar:de vidste, at alle adresser havde et land lig med 'USA', så de regnede med, at de kunne fremskynde forespørgslen ved at udelade det kriterium!

Desværre er optimering af databasehentning ikke rigtig det samme som at barbere mikrosekunder væk fra computertiden. Det indebærer forståelse af databasedesignet, især indekser, og i det mindste et overblik over, hvordan optimeringsværktøjet gør sit arbejde.

Du får generelt bedre resultater af optimeringsværktøjet, når du lærer at samarbejde med den i stedet for at forsøge at overliste den.

Held og lykke med at komme i gang med optimeringen!



  1. Trigger genkender ikke tabel (Trigger for at opdele indhold af NEW.values ​​i flere rækker for at indsætte i en anden tabel)

  2. Hvordan eksporterer man analyserede data fra Python til en Oracle-tabel i SQL Developer?

  3. Kontroller, om en parameter er nul eller tom i en lagret procedure

  4. Får fejl ved brug af prepareStatement med interval i forespørgsel