sql >> Databáze >  >> RDS >> Oracle

Jak přinutit Oracle používat skenování rozsahu indexů?

Chcete-li „přinutit“ Oracle použít skenování rozsahu indexu, jednoduše použijte nápovědu pro optimalizaci INDEX_RS_ASC . Například:

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

Zda to způsobí, že váš dotaz skutečně poběží rychleji, závisí na mnoha faktorech, jako je selektivita indexované hodnoty nebo fyzické pořadí řádků v tabulce. Pokud například změníte dotaz na WHERE b BETWEEN 10 AND <xxx> , v plánech provádění na mém počítači se objevují následující náklady:

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

Změníte-li dotaz velmi mírně, abyste nevybrali pouze indexovaný sloupec b , ale i jiné, neindexované sloupce, se náklady dramaticky mění:

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. Laravel-5 ekvivalent „LIKE“ (výmluvný)

  2. Vkládání dat do sql tabulky v Eclipse EE

  3. Jak vybrat data za posledních 30 dní v MySQL, i když data nejsou přítomna v mysql?

  4. PostgreSQL index na JSON