Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dostrajanie wydajności instrukcji DECODE() w klauzuli WHERE

Sugerowałbym napisanie kodu 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');

Dla tego zapytania polecam indeksy na:

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

Zmiany w powyższym zapytaniu:

  • Nigdy użyj przecinków w FROM klauzula. Zawsze używaj właściwego, wyraźnego, standardowego , czytelne JOIN składnia. (Nie wpływa to jednak na wydajność).
  • decode() jest raczej trudna do naśladowania. Prosty logiczny or jest równoważne.
  • BETWEEN jest niepotrzebne przy założeniu, że datet nie jest w przyszłości.
  • SUM(NVL()) nie jest potrzebne, ponieważ NULL wartości są ignorowane. Jeśli martwisz się o NULL wynik, sugerowałbym 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. Tworzenie sekwencji Oracle, która zaczyna się od alfanumerycznego

  2. Dlaczego nie możemy użyć silnego kursora ref z dynamiczną instrukcją SQL?

  3. Jak utworzyć VARRAY jako obiekt bazy danych w bazie danych Oracle

  4. Jak wyeksportować wynik do różnych zakładek programu Excel w Toad for Data Analyst?

  5. Używanie operatora „LIKE” z podzapytaniem zwracającym wiele wyników