tuve una consulta en los que no se utilizó un índice cuando pensé que podría ser, por lo que la reprodujo por curiosidad:¿Por qué no se utiliza el índice para esta consulta?
Crear un test_table
con 1.000.000 filas (10 valores distintos en col
, 500 bytes de datos en some_data
).
CREATE TABLE test_table AS (
SELECT MOD(ROWNUM,10) col, LPAD('x', 500, 'x') some_data
FROM dual
CONNECT BY ROWNUM <= 1000000
);
Crear un índice y recopilar estadísticas de tabla:
CREATE INDEX test_index ON test_table (col);
EXEC dbms_stats.gather_table_stats('MY_SCHEMA', 'TEST_TABLE');
Intentar obtener valores distintos de col
y la 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
---------------------------------------------------------------------------------
No se utiliza el índice, proporcionando la pista hace no cambiar esto
Supongo que el índice no se puede utilizar en este caso, pero ¿por qué?
Utilizando el índice no sería capaz de evitar que un análisis completo, por lo que realmente no proporciona ningún beneficio. – recursive
@recursive: Parece que es cierto, pero ¿por qué no se prefiere una exploración completa en el índice sobre la exploración de tabla completa? –
Si no encuentra la solución aquí, puede probar asktom.oracle.com (que me ha sido muy útil en el pasado). –