sql >> Database teknologi >  >> RDS >> Oracle

Hvordan tvinger man Oracle til at bruge indeksområdescanning?

For at "tvinge" Oracle til at bruge en indeksområdescanning skal du blot bruge et optimeringstip INDEX_RS_ASC . For eksempel:

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

Hvorvidt dette vil få din forespørgsel til at køre hurtigere, afhænger af mange faktorer som selektiviteten af ​​den indekserede værdi eller den fysiske rækkefølge af rækkerne i din tabel. For eksempel, hvis du ændrer forespørgslen til WHERE b BETWEEN 10 AND <xxx> , vises følgende omkostninger i udførelsesplanerne på min maskine:

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

Hvis du ændrer forespørgslen meget lidt for ikke kun at vælge den indekserede kolonne b , men også andre, ikke-indekserede kolonner, ændrer omkostningerne sig dramatisk:

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. DatoDiff til output timer og minutter

  2. #1242 - Underforespørgsel returnerer mere end 1 række - mysql

  3. JDBC opretter forbindelse til Oracle-database med SSL

  4. Fejl med MySql under pakkeinstallation