sql >> Database >  >> RDS >> Oracle

Hoe Oracle te dwingen om indexbereikscan te gebruiken?

Om Oracle te "dwingen" om een ​​indexbereikscan te gebruiken, gebruikt u eenvoudig een optimalisatiehint INDEX_RS_ASC . Bijvoorbeeld:

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

Of uw query hierdoor daadwerkelijk sneller wordt uitgevoerd, hangt van veel factoren af, zoals de selectiviteit van de geïndexeerde waarde of de fysieke volgorde van de rijen in uw tabel. Als u bijvoorbeeld de zoekopdracht wijzigt in WHERE b BETWEEN 10 AND <xxx> , verschijnen de volgende kosten in de uitvoeringsplannen op mijn machine:

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

Als u de zoekopdracht heel licht wijzigt om niet alleen de geïndexeerde kolom b . te selecteren , maar ook andere, niet-indexkolommen, veranderen de kosten drastisch:

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. tijdzonefunctie bouwen in PHP-webtoepassing

  2. Hoe Oracle 10g xe opnieuw te configureren op Linux

  3. Duplicaatcontrole tussen DATABASE en DATATABLE

  4. NLS_CHARSET_DECL_LEN() Functie in Oracle