Để "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