2009-09-23 13 views
10

¿Alguien ha encontrado un rendimiento lento al usar las funciones analíticas de Oracle? La función analítica oráculo lead() se usó para generar un nuevo campo en la tabla. Básicamente, permitiría usar el valor de campo de la fila anterior como el valor del campo nuevo de la fila actual. El plan de explicación indica que se realiza una exploración de tabla completa en la tabla en la que se utilizó la función de análisis de oráculo.¿Son costosas las funciones analíticas de Oracle?

Para evitar el costo de este escaneo completo de tabla, puede que tenga que acaba de rellenar manualmente un campo concreto con el valor de la fila anterior utilizando una después de insertar/actualizar gatillo

Alguien ha decidido no utilizar una función analítica de Oracle debido a su alto costo? ¿Las funciones analíticas de los oráculos rara vez se usan?

+0

¿Por qué no nos muestra su código? Es muy difícil proporcionar buenos consejos sin eso. No entiendo por qué la función analítica tiene que hacer un escaneo completo de la tabla. ¿No puedes filtrar en id con una cláusula where primero? – tuinstoel

Respuesta

2

Esto depende de cómo esté indexada su tabla y qué funciones use.

ROW_NUMBER(), por ejemplo, parece ser menos eficiente que ROWNUM, incluso si se utilizan los índices. Lee este artículo en mi blog para comparación de rendimiento:

Oracle 's sabe acerca de las funciones de ventana y puede usar varios trucos como STOPKEY y PUSHED RANK lo que las hace más eficientes.

El plan de explicación indica que se realiza una exploración de tabla completa en la tabla en la que se utilizó la función de análisis de oráculo.

El escaneo de la tabla en sí no está nada mal. Esto puede ser óptimo de hecho, si el TABLE ACCESS para recuperar los valores que faltan en el índice es más costoso que el filtrado y la clasificación.

lo general, si se indexa su mesa, la consulta WHERE y ORDER BY cláusulas permiten el uso de este índice para ordenar y optimizador considera que este índice digno de usar, se utiliza el método de WINDOW BUFFERLAG y LEAD funciones.

El motor solo mantiene un almacenamiento intermedio en ejecución de 2 filas (o más, según el valor del desplazamiento) y devuelve los valores de la primera y la segunda fila.

Sin embargo, el optimizador puede considerar que el índice no vale la pena usarlo en absoluto.

En este caso, usará WINDOW SORT: lo mismo pero la clasificación se realiza en la memoria o en el espacio de tabla temporal.

6

las funciones analíticas no son sin costo: tienen que almacenar datos para resultados intermedios (totales acumulados, funciones de ventana ...) que necesitan memoria y también toman algo de potencia de procesamiento. Algunas funciones necesitarán llegar a la última fila de un conjunto de resultados para poder devolver un resultado (MIN/MAX, por ejemplo). La mayoría de las funciones también tendrán una operación SORT implícita.

Por lo tanto, no son gratuitos en términos de recursos, pero son operaciones SET y la mayoría de las veces son mucho más eficientes que escribir el procedimiento plsql personalizado row-by-row o SQL tradicional.

Tendrá que comparar y comparar en su caso específico, pero si los usa sabiamente, verá que son una poderosa herramienta de rendimiento, no un obstáculo.

3

Algunos detalles sobre esto están disponibles en el blog de Jonathan Lewis here.

Realmente la pregunta debería ser, son más o menos costosas que la alternativa, y eso se reducirá a la situación particular. En algunos casos, es posible que prefiera extraer los datos a un servidor de aplicaciones y procesarlos solo porque generalmente es más barato/más fácil tener hardware adicional en ese nivel.

Pero si tuviera la opción entre hacerlo en el SQL y agregar el procesamiento PL/SQL, generalmente usaría el SQL.

1

Por supuesto, tienen un costo y tienes que decidir si puedes pagarlo o no.

En mi caso, creé un procedimiento almacenado que itera una tabla y calcula algunas fechas utilizando la función Oracle lead() y almacena los resultados en otra tabla. Finalmente, uso esta tabla posterior en mi aplicación y actualizo la primera tabla (ejecutando el procedimiento almacenado) una vez a la semana porque esos datos no cambian con frecuencia.

Para mí, esta era la mejor solución.

Cuestiones relacionadas