Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zmusić Oracle do korzystania ze skanowania zakresu indeksów?

Aby „zmusić” Oracle do użycia skanowania zakresu indeksów, po prostu użyj podpowiedzi optymalizatora INDEX_RS_ASC . Na przykład:

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

To, czy spowoduje to szybsze działanie zapytania, zależy od wielu czynników, takich jak selektywność wartości indeksowanej lub fizyczna kolejność wierszy w tabeli. Na przykład, jeśli zmienisz zapytanie na WHERE b BETWEEN 10 AND <xxx> , w planach wykonania na moim komputerze pojawiają się następujące koszty:

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

Jeśli zmienisz zapytanie bardzo nieznacznie, aby nie tylko wybrać indeksowaną kolumnę b , ale także inne, nieindeksowe kolumny, koszty zmieniają się dramatycznie:

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. Jak zoptymalizować zapytanie Oracle, które ma to_char w klauzuli where dla daty?

  2. Zrób skumulowaną sumę w widoku wyrocznia

  3. Wyciąganie podciągu z podanego ciągu

  4. Używanie DateDiff() w Oracle

  5. Co zrobić, jeśli podczas korzystania z programu SQL Server z naszym sterownikiem Oracle ODBC pojawi się niepoprawny błąd porządkowy zakładki?