Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Ajuste de desempenho de uma instrução DECODE() em uma cláusula WHERE


Sugiro escrever o código como:
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');

Para esta consulta, eu recomendaria índices em:
  • db(nd_id, a_id, id, datet, code)
  • dd(dsba_id, datet, v_id)

As alterações na consulta acima:
  • Nunca use vírgulas no FROM cláusula. Sempre use apropriado, explícito, padrão , legível JOIN sintaxe. (No entanto, isso não afeta o desempenho.)
  • decode() é bastante difícil de seguir. Um simples booleano or é equivalente.
  • BETWEEN é desnecessário assumindo que datet não está no futuro.
  • SUM(NVL()) não é necessário, porque NULL valores são ignorados. Se você está preocupado com NULL resultado, sugiro COALESCE(SUM(dd.amt), 0)