Oracle को इंडेक्स रेंज स्कैन का उपयोग करने के लिए "बल" देने के लिए, बस एक ऑप्टिमाइज़र संकेत का उपयोग करें INDEX_RS_ASC
. उदाहरण के लिए:
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
क्या इससे आपकी क्वेरी वास्तव में तेज़ी से चलेगी या नहीं यह कई कारकों पर निर्भर करता है जैसे अनुक्रमित मूल्य की चयनात्मकता या आपकी तालिका में पंक्तियों का भौतिक क्रम। उदाहरण के लिए, यदि आप क्वेरी को WHERE b BETWEEN 10 AND <xxx>
में बदलते हैं , मेरी मशीन पर निष्पादन योजनाओं में निम्नलिखित लागतें दिखाई देती हैं:
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
यदि आप न केवल अनुक्रमित कॉलम का चयन करने के लिए क्वेरी को थोड़ा बदलते हैं b
, लेकिन अन्य, गैर-सूचकांक कॉलम भी, लागत नाटकीय रूप से बदलती है:
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