Để "buộc" Oracle sử dụng quét phạm vi chỉ mục, chỉ cần sử dụng gợi ý 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 sẽ làm cho truy vấn của bạn thực sự chạy nhanh hơn phụ thuộc vào nhiều yếu tố như chọn lọc 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 để WHERE b BETWEEN 10 AND <xxx>
, các chi phí sau xuất hiện trong kế hoạch thực hiện trên máy tính 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 câu hỏi rất nhẹ để không chỉ chọn cột được lập chỉ mục b
, mà còn khác, các cột 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
Nguồn
2012-12-14 18:45:38
Vì đây là phạm vi quét, tôi tự hỏi liệu các truy vấn 'chậm' có hoạt động với phạm vi lớn hơn (ví dụ: một năm thay vì một tuần). Trong trường hợp đó, bạn mong đợi chúng chậm hơn đáng kể. Tại một số điểm, khi phạm vi đủ lớn, sẽ có ý nghĩa khi chuyển từ chỉ mục sang quét toàn bộ. Cho dù Oracle đã đoán điểm đó đúng là một vấn đề khác. –
Hơn nữa, nếu nó quét toàn bộ chỉ mục và truy vấn của bạn đang tham gia vào một bảng khác, tôi đoán nó không tham gia qua vòng lặp lồng nhau - có thể chuyển sang băm hoặc hợp nhất hoặc tham gia các bảng theo thứ tự khác. Nếu các truy vấn chậm "nên" nhanh hơn (nghĩa là chúng không phải là IRL truy vấn phần trăm đáng kể của bảng), bạn sẽ có thể quay lại phạm vi quét bằng cách gợi ý cho các vòng lồng nhau (với gợi ý 'USE_NL' phù hợp). –