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

Bagaimana cara memaksa Oracle untuk menggunakan pemindaian rentang indeks?

Untuk "memaksa" Oracle menggunakan pemindaian rentang indeks, cukup gunakan petunjuk pengoptimal INDEX_RS_ASC . Misalnya:

CREATE TABLE mytable (a NUMBER NOT NULL, b NUMBER NOT NULL, c CHAR(10)) NOLOGGING;

INSERT /*+ APPEND */ INTO mytable(a,b,c) 
SELECT level, mod(level,100)+1, 'a'  FROM dual CONNECT BY level <= 1E6;

CREATE INDEX myindex_ba ON mytable(b, a);
EXECUTE dbms_stats.gather_table_stats(NULL,'mytable');

SELECT /*+ FULL(m)         */ b FROM mytable m WHERE b=10; -- full table scan
SELECT /*+ INDEX_RS_ASC(m) */ b FROM mytable m WHERE b=10; -- index range scan
SELECT /*+ INDEX_FFS(m)    */ b FROM mytable m WHERE b=10; -- index fast full scan

Apakah ini akan membuat kueri Anda benar-benar berjalan lebih cepat bergantung pada banyak faktor seperti selektivitas nilai yang diindeks atau urutan fisik baris di tabel Anda. Misalnya, jika Anda mengubah kueri menjadi WHERE b BETWEEN 10 AND <xxx> , biaya berikut muncul dalam rencana eksekusi di mesin saya:

b BETWEEN 10 AND    10     20      40     80
FULL               749    750     751    752
INDEX_RS_ASC        29    325     865   1943
INDEX_FFS          597    598     599    601

Jika Anda mengubah kueri sedikit untuk tidak hanya memilih kolom yang diindeks b , tetapi juga kolom non-indeks lainnya, biayanya berubah secara dramatis:

b BETWEEN 10 AND    10     20      40     80
FULL               749    750     751    754
INDEX_RS_ASC      3352  40540  108215 243563
INDEX_FFS         3352  40540  108215 243563


  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 mendapatkan nilai checksum untuk potongan data yang ditentukan oleh klausa pilih

  2. Oracle Stored Procedure inout parameter masalah - Mendapat solusinya - Kesalahan ketik

  3. Oracle membuat tautan db menggunakan skema proxy

  4. Pilih nilai kolom tunggal dan simpan dalam variabel Oracle sql

  5. Mengapa Group By Mysql dan Group by Oracle berbeda?