Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да принудя Oracle да използва сканиране на диапазон на индекс?

За да „принудите“ 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL заявка за преброяване на промените на стойностите в колона

  2. Преминете през предварително зададени стойности

  3. Как да създадете работа, когато job_action трябва да извика процедура с параметър CLOB

  4. SQL грешка:ORA-00933:SQL командата не е приключила правилно

  5. Не може да се създаде Oracle View с достъп до обекти на други схеми, въпреки разрешенията