¿Cómo puedo elegir diferentes pistas para diferentes se une para una sola tabla de una sugerencia de consulta?

StackOverflow https://stackoverflow.com/questions/2524248

Pregunta

Supongamos que tengo la siguiente consulta:

select * from A, B, C, D
where A.x = B.x
and B.y = C.y
and A.z = D.z

Tengo índices en A.x y B.x y B.y y C.y y D.z

No hay índice en A.z.

¿Cómo se puede dar una pista a esta consulta para utilizar una sugerencia de índice en A.x pero un toque USE_HASH en A.z? Parece consejos sólo tienen el nombre de tabla, no el específico unirse, por lo que cuando se utiliza una sola tabla con varias combinaciones sólo puedo especificar una estrategia única para todos ellos.

Alternativa, supongamos que estoy usando uno de los principales o indirecta ORDENADO en la consulta anterior. Ambos de estos consejos sólo tienen un nombre de tabla, así que ¿cómo puedo asegurar que el A.x = B.x unirse lleva a cabo antes de la A.z = D.z uno? Soy consciente de que en este caso podría enumerar D principio, pero imaginar D se une posteriormente a E y que el D-E unirse es el último que quiero en toda la consulta.

Una tercera configuración - Supongamos que yo quiero que el A.x uno a ser el primero de toda la consulta, y quiero que el A.z unen a ser el último. ¿Cómo puedo usar una pista para tener una sola combinación desde la A a tener lugar, seguido por el B-C unirse, y la A-D se unen a la última?

¿Fue útil?

Solución

En primer lugar, el uso de estos consejos debe ser el último recurso, no una forma normal de escribir consultas. La mayoría de las veces sólo debe asegurarse de que las estadísticas optimizador están al día y dejar que el trabajo CBO a cabo la ruta óptima para sí mismo - que es su trabajo

La sugerencia INDEX puede especificar el nombre del índice que desea utilizar como esto:

SELECT /*+ INDEX (A, A_X_IDX) */ *
...

(suponiendo que el índice en A.X se llama A_X_IDX).

No se puede saber Oracle uso Uso del índice en A.X y utilizar una combinación hash al cuadro A de la misma declaración, que no tiene sentido. Sin embargo, puede (si es necesario) especificar la ruta de acceso para cada mesa algo como:

SELECT /*+ INDEX (A, A_X_IDX) INDEX(B, B_Y_IDX) USE_HASH(C) */ *

Pero para reiterar, debería ser raras a necesidad de hacer esto. Oracle ha invertido millones de dólares y de horas-hombre en el desarrollo de la CBO, ¿por qué cambiar efectivamente a cabo?

Otros consejos

En SQL Server, se haría un hash pista conjunta como esto

SELECT * FROM table1 t1
INNER hash join table2 t2 ON  t1.id = t2.id

y también se puede suministrar una sugerencia de índice

select * from table1 t1
inner  join table2 t2 with (index( bla))  on  t1.id = t2.id

No sabe lo que las miradas de sintaxis como en Oracle, por cierto ¿Por qué utiliza une al viejo estilo? ¿Está todavía en 8i?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top