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

di mana permintaan rownum=1 membutuhkan waktu di Oracle

Pertanyaan ini sudah dijawab, saya hanya akan memberikan penjelasan mengapa terkadang filter ROWNUM=1 atau ROWNUM <=1 dapat menghasilkan waktu respons yang lama.

Saat menemukan filter ROWNUM (pada satu tabel), pengoptimal akan menghasilkan FULL SCAN dengan COUNT STOPKEY. Ini berarti Oracle akan mulai membaca baris sampai menemukan N baris pertama (di sini N=1). Pemindaian penuh membaca blok dari tingkat pertama hingga tanda air tinggi. Oracle tidak memiliki cara untuk menentukan blok mana yang berisi baris dan mana yang tidak sebelumnya, karena itu semua blok akan dibaca sampai N baris ditemukan. Jika blok pertama kosong, itu bisa mengakibatkan banyak pembacaan.

Pertimbangkan hal berikut:

SQL> /* rows will take a lot of space because of the CHAR column */
SQL> create table example (id number, fill char(2000));

Table created

SQL> insert into example 
  2     select rownum, 'x' from all_objects where rownum <= 100000;

100000 rows inserted

SQL> commit;

Commit complete

SQL> delete from example where id <= 99000;

99000 rows deleted

SQL> set timing on
SQL> set autotrace traceonly
SQL> select * from example where rownum = 1;

Elapsed: 00:00:05.01

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=1 Bytes=2015)    
   1    0   COUNT (STOPKEY)
   2    1     TABLE ACCESS (FULL) OF 'EXAMPLE' (TABLE) (Cost=7 Card=1588 [..])

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      33211  consistent gets
      25901  physical reads
          0  redo size
       2237  bytes sent via SQL*Net to client
        278  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

Seperti yang Anda lihat, jumlah perolehan yang konsisten sangat tinggi (untuk satu baris). Situasi ini dapat ditemui dalam beberapa kasus di mana misalnya, Anda menyisipkan baris dengan /*+APPEND*/ petunjuk (dengan demikian di atas tanda air tinggi), dan Anda juga menghapus baris terlama secara berkala, sehingga banyak ruang kosong di awal segmen.



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

  2. Bagaimana cara menemukan definisi batasan bernama di Oracle?

  3. Penyedia tidak kompatibel dengan versi kesalahan klien Oracle saat menggunakan Oracle.DataClient

  4. ORA-01843:bukan bulan yang valid

  5. Kesalahan ORA-01791 Pl-Sql