sql >> Base de Datos >  >> RDS >> Oracle

Ajuste del rendimiento de una sentencia DECODE() en una cláusula WHERE

Yo sugeriría escribir el 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, recomendaría índices en:

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

Los cambios a la consulta anterior:

  • Nunca use comas en FROM cláusula. Utilice siempre mensajes estándar adecuados, explícitos , legible JOIN sintaxis. (Sin embargo, esto no afecta el rendimiento).
  • decode() es bastante difícil de seguir. Un simple booleano or es equivalente.
  • BETWEEN es innecesario asumiendo que datet no está en el futuro.
  • SUM(NVL()) no es necesario, porque NULL los valores son ignorados. Si le preocupa NULL resultado, sugeriría COALESCE(SUM(dd.amt), 0)