sql >> Databasteknik >  >> RDS >> Oracle

Prestandajustering av en DECODE()-sats i en WHERE-sats

Jag skulle föreslå att du skriver 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');

För den här frågan skulle jag rekommendera index på:

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

Ändringarna av ovanstående fråga:

  • Aldrig använd kommatecken i FROM klausul. Använd alltid korrekt, tydlig, standard , läsbar JOIN syntax. (Detta påverkar dock inte prestandan.)
  • decode() är ganska svårt att följa. En enkel boolesk or är likvärdig.
  • BETWEEN är onödigt om man antar att datet är inte i framtiden.
  • SUM(NVL()) behövs inte eftersom NULL värden ignoreras. Om du är orolig för NULL resultat skulle jag föreslå COALESCE(SUM(dd.amt), 0)



  1. PHP/MySQL infoga rad och få 'id'

  2. GeoIP-tabell förenas med tabell över IP-adresser i MySQL

  3. Hur fixar jag mysqli::real_connect():SSL-drift misslyckades fel?

  4. Använder 'slut' som kolumnnamn i Ruby on Rails (MySQL)