Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để buộc oracle sử dụng tính năng quét phạm vi chỉ mục?

Để "buộc" Oracle sử dụng tính năng quét phạm vi chỉ mục, chỉ cần sử dụng gợi ý trình tối ưu hóa INDEX_RS_ASC . Ví dụ:

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

Điều này có làm cho truy vấn của bạn thực sự chạy nhanh hơn hay không phụ thuộc vào nhiều yếu tố như tính chọn lọc của giá trị được lập chỉ mục hoặc thứ tự vật lý của các hàng trong bảng của bạn. Ví dụ:nếu bạn thay đổi truy vấn thành WHERE b BETWEEN 10 AND <xxx> , các chi phí sau xuất hiện trong kế hoạch thực thi trên máy của tôi:

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

Nếu bạn thay đổi truy vấn một chút để không chỉ chọn cột được lập chỉ mục b , ngoài các cột khác, không phải chỉ mục, chi phí thay đổi đáng kể:

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- tạo một tập kết quả tạm thời để sử dụng trong một truy vấn

  2. Oracle SQL tạo đầu ra ngẫu nhiên với các thẻ danh sách

  3. Cách thực hiện Pivoting trong Oracle 10g

  4. Hết thời gian chờ của OracleDataAdapter.Fill ()

  5. .nextval JDBC chèn sự cố