sql >> Databáze >  >> RDS >> Oracle

Ladění výkonu příkazu DECODE() v klauzuli WHERE

Navrhoval bych napsat kód jako:

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

Pro tento dotaz bych doporučil indexy na:

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

Změny ve výše uvedeném dotazu:

  • Nikdy použijte čárky v FROM doložka. Vždy používejte správné, explicitní, standardní , čitelné JOIN syntax. (To však nemá vliv na výkon.)
  • decode() je poměrně těžké sledovat. Jednoduchý booleovský or je ekvivalentní.
  • BETWEEN je zbytečné za předpokladu, že datet není v budoucnosti.
  • SUM(NVL()) není potřeba, protože NULL hodnoty jsou ignorovány. Pokud vás znepokojuje NULL výsledek bych navrhoval COALESCE(SUM(dd.amt), 0)



  1. Rekurzivní dotaz, kde kotva a člen mají spojení

  2. Lightswitch neumožňuje přidávat nebo upravovat záznamy v MySQL

  3. Spuštění ProxySQL jako pomocného kontejneru na Kubernetes

  4. Jak obnovit databázi pomocí RMAN