sql >> Database >  >> RDS >> Oracle

Prestaties afstemmen van een DECODE()-instructie in een WHERE-component

Ik stel voor om de code te schrijven als:

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');

Voor deze vraag raad ik indexen aan op:

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

De wijzigingen in de bovenstaande zoekopdracht:

  • Nooit gebruik komma's in de FROM clausule. Gebruik altijd de juiste, expliciete, standaard , leesbare JOIN syntaxis. (Dit heeft echter geen invloed op de prestaties.)
  • decode() is nogal moeilijk te volgen. Een eenvoudige booleaanse or is equivalent.
  • BETWEEN is niet nodig, ervan uitgaande dat datet is niet in de toekomst.
  • SUM(NVL()) is niet nodig, omdat NULL waarden worden genegeerd. Als je je zorgen maakt over NULL resultaat, stel ik voor COALESCE(SUM(dd.amt), 0)



  1. Android Room Library kan database niet kopiëren van Asset

  2. C# Mysql-verbinding in txt-bestandsconfiguratie

  3. Google Cloud SQL SSL mislukt peer-certificaatvalidatie

  4. Tussen instructie ontbrekende indexen in bepaalde gevallen