У меня был запрос, где индекс не был использован, когда я думал, что это может быть, поэтому я воспроизводил его из любопытства:Почему индекс не используется для этого запроса?
Создать test_table
с 1.000.000 строк (10 различных значений в col
, 500 байт данных в some_data
).
CREATE TABLE test_table AS (
SELECT MOD(ROWNUM,10) col, LPAD('x', 500, 'x') some_data
FROM dual
CONNECT BY ROWNUM <= 1000000
);
Создание индекса и собирать статистику таблицы:
CREATE INDEX test_index ON test_table (col);
EXEC dbms_stats.gather_table_stats('MY_SCHEMA', 'TEST_TABLE');
Try, чтобы получить различные значения col
и COUNT
:
EXPLAIN PLAN FOR
SELECT col, COUNT(*)
FROM test_table
GROUP BY col;
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 30 | 15816 (1)| 00:03:10
| 1 | HASH GROUP BY | | 10 | 30 | 15816 (1)| 00:03:10
| 2 | TABLE ACCESS FULL| TEST_TABLE | 994K| 2914K| 15755 (1)| 00:03:10
---------------------------------------------------------------------------------
Индекс не используется, обеспечивая намек делает не измените это.
Я думаю, индекс не может быть использован в этом случае, но почему?
Использование индекса не будет в состоянии предотвратить полную проверку, так что это на самом деле не дает никаких преимуществ. – recursive
@recursive: Похоже, это правда, но почему это не полное сканирование индекса, предпочитаемого над полным сканированием таблицы? –
Если вы не нашли здесь решение, попробуйте asktom.oracle.com (что было очень полезно для меня в прошлом). –