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

Ydeevnejustering af en DECODE()-sætning i en WHERE-sætning

Jeg vil foreslå at skrive koden som:

SELECT SUM(dd.amt)
FROM db JOIN
     dd
     ON db.id = dd.dsba_id
WHERE dd.nd_id = xxxxxxx AND
      dd.a_id = 'xxxxx-xx' AND
      (db.v_id = xxxxxxxxx OR db.code = 'COMPLETE') AND
      db.datet >= trunc(sysdate, 'YEAR');

Til denne forespørgsel vil jeg anbefale indekser på:

  • db(nd_id, a_id, id, datet, code)
  • dd(dsba_id, datet, v_id)

Ændringerne af ovenstående forespørgsel:

  • Aldrig brug kommaer i FROM klausul. Brug altid korrekt, eksplicit, standard , læsbar JOIN syntaks. (Dette påvirker dog ikke ydeevnen.)
  • decode() er ret svær at følge. En simpel boolesk or er tilsvarende.
  • BETWEEN er unødvendigt forudsat at datet er ikke i fremtiden.
  • SUM(NVL()) er ikke nødvendig, fordi NULL værdier ignoreres. Hvis du er bekymret over NULL resultat, vil jeg foreslå COALESCE(SUM(dd.amt), 0)



  1. MySQL:få MAX eller GREATEST af flere kolonner, men med NULL-felter

  2. MySQL flere indekser vs multi-kolonne indeks til søgning

  3. Vinduesfunktioner:sidste_værdi(ORDER BY ... ASC) samme som last_value(ORDER BY ... DESC)

  4. Fejlkode:1290. MySQL-serveren kører med --secure-file-priv indstillingen, så den kan ikke udføre denne sætning