2009-01-07 14 views
15

Estoy tratando de optimizar el rendimiento de las consultas y he tenido que recurrir al uso de consejos del optimizador. Pero nunca supe si el optimizador usará más de una pista a la vez.¿El optimizador de Oracle usará varias sugerencias en el mismo SELECCIONAR?

p. Ej.

SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/ 
     /*+ LEADING(i vol) */ 
     /*+ ALL_ROWS */ 
     i.id_number, 
     ... 
    FROM i_table i 
    JOIN vol_table vol on vol.id_number = i.id_number 
    JOIN to_a_bunch_of_other_tables... 
WHERE i.solicitor_id = '123' 
    AND vol.solicitable_ind = 1; 

La explicar el plan muestra el mismo costo, pero sé que eso es sólo una estimación.

Supongamos que se han calculado todas las estadísticas de tabla e índice. FYI, el índice dcf_vol_prospect_ids_idx está en la columna i.solicitor_id.

Gracias,

Guiso

Respuesta

19

intente especificar todas las pistas en un solo bloque de comentario, como se muestra en este ejemplo de la documentación de Oracle maravillosa (http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm).

16.2.1 Especificación de un conjunto completo de Consejos

Cuando el uso de sugerencias, en algunos casos, es posible que tenga que especificar un conjunto completo de consejos con el fin de asegurar que el plan óptima ejecución. Por ejemplo, si tiene una consulta muy compleja, que consta de muchas uniones de tablas, y si sólo se especifica la sugerencia INDEX para una mesa dado, a continuación, el optimizador necesita para determinar el restante acceso caminos para ser utilizado , así como los métodos de unión correspondientes . Por lo tanto, a pesar de que dio la sugerencia INDEX, posible que el optimizador no necesariamente uso que hacen alusión, porque el optimizador podría haber determinado que el índice solicitada no se puede utilizar debido a al unirse a los métodos y las vías de acceso seleccionados por el optimizador.

En el Ejemplo 16-1, la indirecta LEADING especifica el orden exacto unirse ser utilizados; los métodos de unión que se utilizarán en las diferentes tablas también están especificadas en .

Ejemplo 16-1 Especificación de un conjunto completo de Consejos

SELECT /*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk) 
      USE_MERGE(j) FULL(j) */ 
    e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal 
FROM employees e1, employees e2, job_history j 
WHERE e1.employee_id = e2.manager_id 
    AND e1.employee_id = j.employee_id 
    AND e1.hire_date = j.start_date 
GROUP BY e1.first_name, e1.last_name, j.job_id ORDER BY total_sal; 
+0

Si a alguien le importa, probé esto y el Plan de explicación le dio el mismo costo que antes. ¡Quién sabe si la CBO realmente lo usará! : -/ –

+0

Dave, Tengo cierto RTFMed ese capítulo, pero nunca me encontré con ese gran ejemplo. Perdón por la publicación tonta; ¡Realmente trato de no hacer eso!: -/Gracias , Guiso –

2

De hecho, la recomendación de Jonathan Lewis, autor de Fundamentos de Oracle basadas en los costes es que si la CBO falla en encontrar la correcta plan, debe hacerse cargo del trabajo de la CBO y "aplicar capas" a los consejos: un promedio de dos sugerencias por tabla en la consulta.

La razón es que una pista podría conducir a otro plan malo y posiblemente incluso peor de lo que la CBO recibiría sin ayuda. Si el CBO es incorrecto, debes darle todo el plan, no solo un pequeño empujón en la dirección correcta.

+0

> Si la CBO está mal Eso parece bastante grande si, no? :-) Sin embargo, un punto interesante. Por lo que leí de Tom Kyte, recomienda hacer todo lo demás posible antes de usar Sugerencias. –

+1

TOTALMENTE de acuerdo. Pero la CBO puede y estará equivocada. No hay código complejo que pueda ser perfecto. Soy un devoto de TK y tiene razón. Sin mencionar que el 90% de los programadores y DBA no saben cuándo la CBO está realmente equivocada y solo se la mienten. –

Cuestiones relacionadas