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

Bagaimana saya bisa mempercepat row_number di Oracle?

ROW_NUMBER cukup tidak efisien dalam Oracle .

Lihat artikel di blog saya untuk detail performa:

  • Oracle:ROW_NUMBER vs ROWNUM

Untuk kueri spesifik Anda, saya sarankan Anda menggantinya dengan ROWNUM dan pastikan indeks yang digunakan:

SELECT  *
FROM    (
        SELECT  /*+ INDEX_ASC(t index_on_column) NOPARALLEL_INDEX(t index_on_column) */
                t.*, ROWNUM AS rn
        FROM    table t
        ORDER BY
                column
        )
WHERE rn >= :start
      AND rownum <= :end - :start + 1

Kueri ini akan menggunakan COUNT STOPKEY

Pastikan juga Anda column tidak dapat dibatalkan, atau tambahkan WHERE column IS NOT NULL kondisi.

Jika tidak, indeks tidak dapat digunakan untuk mengambil semua nilai.

Perhatikan bahwa Anda tidak dapat menggunakan ROWNUM BETWEEN :start and :end tanpa subkueri.

ROWNUM selalu ditetapkan terakhir dan diperiksa terakhir, begitulah ROWNUM selalu berurutan tanpa celah.

Jika Anda menggunakan ROWNUM BETWEEN 10 and 20 , baris pertama yang memenuhi semua ketentuan lainnya akan menjadi kandidat untuk kembali, sementara ditetapkan dengan ROWNUM = 1 dan gagal dalam ujian ROWNUM BETWEEN 10 AND 20 .

Kemudian baris berikutnya akan menjadi kandidat, ditugaskan dengan ROWNUM = 1 dan gagal, dll., jadi, akhirnya, tidak ada baris yang dikembalikan sama sekali.

Ini harus diatasi dengan meletakkan ROWNUM 's ke dalam subkueri.



  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*Plus bagaimana cara menerima variabel teks dari prompt?

  2. cx_Oracle:Bagaimana saya bisa menerima setiap baris sebagai kamus?

  3. Sepenuhnya Memahami PDO ATTR_PERSISTENT

  4. Cara Mengembalikan Daftar Wilayah yang Didukung di Oracle

  5. Jenis Tabel dalam Contoh Prosedur Tersimpan Oracle