Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Fungsi Oracle Analytic untuk nilai minimum dalam pengelompokan

Saya pikir fungsi Rank() bukan cara yang tepat untuk ini, karena dua alasan.

Pertama, metode ini mungkin kurang efisien dibandingkan metode berbasis Min().

Alasan untuk ini adalah bahwa kueri harus mempertahankan daftar pesanan semua gaji per departemen saat memindai data, dan peringkat kemudian akan ditetapkan kemudian dengan membaca ulang daftar ini. Jelas dengan tidak adanya indeks yang dapat dimanfaatkan untuk ini, Anda tidak dapat menetapkan peringkat sampai item data terakhir telah dibaca, dan pemeliharaan daftar itu mahal.

Jadi, kinerja fungsi Rank() bergantung pada jumlah total elemen yang akan dipindai, dan jika jumlahnya cukup sehingga pengurutan tumpah ke disk, maka kinerja akan runtuh.

Ini mungkin lebih efisien:

select dept,
       emp,
       salary
from
       (
       SELECT dept, 
              emp,
              salary,
              Min(salary) Over (Partition By dept) min_salary
       FROM   mytable
       )
where salary = min_salary
/

Metode ini hanya mengharuskan kueri mempertahankan satu nilai per departemen dari nilai minimum yang ditemui sejauh ini. Jika minimum baru ditemukan maka nilai yang ada diubah, jika tidak, nilai baru akan dibuang. Jumlah total elemen yang harus disimpan dalam memori terkait dengan jumlah departemen, bukan jumlah baris yang dipindai.

Bisa jadi Oracle memiliki jalur kode untuk mengenali bahwa Peringkat tidak benar-benar perlu dihitung dalam kasus ini, tetapi saya tidak akan bertaruh untuk itu.

Alasan kedua untuk tidak menyukai Rank() adalah karena hanya menjawab pertanyaan yang salah. Pertanyaannya bukan "Catatan mana yang memiliki gaji yang menempati peringkat pertama ketika gaji per departemen diurutkan secara menaik", melainkan "Catatan mana yang memiliki gaji minimum per departemen". Itu membuat perbedaan besar bagi saya, setidaknya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih kolom indeks tabel

  2. Oracle:Setel Batas Waktu Kueri

  3. cara menanyakan database Oracle berdasarkan input pengguna menggunakan asp.net c#

  4. Mengoptimalkan kode dalam PL/SQL. Membuatnya menjadi tepat. Kode berjalan tetapi tidak tepat

  5. kumpulan catatan ke sys_refcursor