Oracle
 sql >> база данни >  >> RDS >> Oracle

Настройка на производителността на оператор DECODE() в клауза WHERE

Бих предложил да напишете кода като:

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

За тази заявка бих препоръчал индекси на:

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

Промените в горната заявка:

  • Никога използвайте запетаи в FROM клауза. Винаги използвайте правилно, изрично, стандартно , четимо JOIN синтаксис. (Това обаче не засяга производителността.)
  • decode() е доста трудно за следване. Обикновено булево or е еквивалентен.
  • BETWEEN е ненужен, ако приемем, че datet не е в бъдещето.
  • SUM(NVL()) не е необходимо, защото NULL стойностите се игнорират. Ако сте загрижени за NULL резултат, бих предложил COALESCE(SUM(dd.amt), 0)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да сравняваме групи от кортежи в sql

  2. избиране на NLS_LANG за Oracle

  3. Създаване на Java приложение в Oracle JDeveloper, част 1

  4. Създайте потребител с всички привилегии в Oracle

  5. Oracle SQL конкатенация на редове по периоди