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

Ottimizzazione delle prestazioni di un'istruzione DECODE() in una clausola WHERE

Suggerirei di scrivere il codice come:

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

Per questa query, consiglierei gli indici su:

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

Le modifiche alla query precedente:

  • Mai usa le virgole nel FROM clausola. Usa sempre uno standard corretto, esplicito , leggibile JOIN sintassi. (Ciò non influisce sulle prestazioni, tuttavia.)
  • decode() è piuttosto difficile da seguire. Un semplice or booleano è equivalente.
  • BETWEEN non è necessario supponendo che datet non è nel futuro.
  • SUM(NVL()) non è necessario, perché NULL i valori vengono ignorati. Se sei preoccupato per NULL risultato, suggerirei COALESCE(SUM(dd.amt), 0)