sql >> Base de Datos >  >> RDS >> Oracle

Unirse toma demasiado tiempo

Mirando todos los campos involucrados, un índice de cobertura en cada tabla involucraría muchas columnas

t1: Y, F, H, A
t2: X, G, C, D, E

¿Qué tan selectivos son CUALQUIERA de los criterios:t2.X, t2.G o t1.Y, t1.F, t1.H?

Si ninguna de las columnas individuales es lo suficientemente selectiva (idealmente, 0,5 % o menos), es posible que desee crear uno o varios índices de cobertura que involucren varias columnas, por ejemplo

t2 (G, X)
t1 (H, F, Y)

Nota: El orden de las columnas en un índice es muy importante:siempre coloque primero el más selectivo (el que divide los datos de la columna en los conjuntos más distintos).

A expensas del almacenamiento, puede hacer que el índice CUBRA la consulta proporcionando todas las columnas necesarias en el propio índice. Esto significa que la consulta no necesita volver a los datos de la tabla.

create index ix_t2 on t2 (G,X) INCLUDE (C,D,E)
create index ix_t1 on t1 (H,F,Y) INCLUDE (A)

EDITAR

Parece que deslicé un DDL de SQL Server allí. En Oracle, tendría que expandir el índice para convertirse en t2 (G,X, C,D,E), pero eso aumenta los requisitos de selectividad para el uso del índice, ya que la clave del índice se vuelve muy larga.