PDA

Ver la Versión Completa : Que es más eficiente, un procedimiento almacenado o un select de una vista


Carlitos
24-10-2003, 11:34:10
Hola,

Me gustaría saber si alguien puede decirme, cuantitativamente si es posible, qué es más eficiente: un procedimiento almacenado al que le paso la condición de filtro (por ejemplo una fecha) y que es simplemente un select, o una vista a la cual le aplico un select con la condición. Realmente es una cuestion de saber si IB/FB cuando se le aplica un select a una vista primero ejecuta la vista y luego aplica la clausula where de mi filtro o anida mi filtro a la clausula where de la vista que sería lo más eficiente...

Gracias de antemano...

SCORDOBA
24-10-2003, 17:23:20
La eficiencia es la misma. (todo depende del diseño SQL)Los procedimientos se usan para encapsular reglas de negocio. En una view no puedes hacer esto.

Carlitos
24-10-2003, 18:39:37
Eso ya lo sé, aunque los procedimientos pueden actuar como una vista pero con un 'order by'..
Pero esto no responde a mi pregunta: un 'where' sobre una vista se aplica anidada a la clausula 'where' de la propia vista o por el contrario primero se ejecuta la vista y luego se aplica la segunda clausula 'where'... Es un detalle muy sutíl pero en mi caso puede suponer el que encuentres primero unos dos o tres millones de registros y luego vuelvas a buscar otra vez, o simplemente buscas directamente lo que quieres...

guillotmarc
24-10-2003, 20:25:42
Hola.

A mi, si he entendido bien el caso, me da la impresión que seria más costosa la vista que el procedimiento.

Tienes una vista, por ejemplo DATOS_2003 basada en digamos la tabla MOVIMIENTOS.

DATOS_2003 --> select * from MOVIMIENTOS where extract(year from fecha) = 2003

Ahora quieres saber cuales de estos datos cumplen una condición.

Alternativa A), usar la vista

select * from DATOS_2003 where pago >= :FECHA

Alternativa B), usar un procedimiento almacenado que se basa directamente en las tablas (no usa la vista)

select * from MOVIMIENTOS where extract(year from fecha) = 2003 and pago >= :FECHA

En el caso B) hay la sobrecarga de llamada y paso de parámetros en el procedimiento que ha comentado Kinobi, pero el caso A) es más costoso puesto que el motor debe compilar esa consulta (mientras que un procedimiento siempre está compilado).

En todo caso, estos tiempos són bastante pequeños. A menos que tengas que ejecutar muchas veces seguidas esa acción, no es un tiempo del que tengas que preocuparte especialmente. Lo importante es ver que en los dos casos se aprovechen los índices de las tablas, para que la consulta se optimize adecuadamente.

En el caso del procedimiento almacenado, el optimizador lo tiene fácil para identificar los índices a usar. Pero al aplicar un where sobre la vista, el optimizador lo tiene más complicado.

Mi propia experiencia es que una vez que intenté utilizar una vista, filtrandola en una consulta, el motor calculaba toda la vista y después filtraba el resultado (es decir no utilizaba los índices para reducir el tiempo de respuesta). Tuve que utilizar un procedimiento almacenado, que era igual que la vista pero con el where incorporado a la consulta, para que el tiempo de respuesta fuera óptimo.

El problema del optimizador en ese caso, imagino que era debido a que la vista estaba formada por la UNION de varias consultas. De forma que el optimizador tendría que usar un índice distinto para cada una de las consultas unidas en la vista (cosa que no hacía).

Ya sé que solo es un caso particular, pero puedes estar bastante seguro que el optimizador tendrá menos problemas para determinar un plan óptimo, con un procedimiento almacenado que se basa en las propias tablas, que con una consulta que filtra una vista.

Saludos.

kinobi
24-10-2003, 20:28:45
Hola,

Posteado originalmente por guillotmarc
En el caso B) hay la sobrecarga de llamada y paso de parámetros en el procedimiento que ha comentado Kinobi, pero el caso A) es más costoso puesto que el motor debe compilar esa consulta (mientras que un procedimiento siempre está compilado).

Perdona Marc, no te vi poniendo tu mensaje, estaba eliminado el mío anterior, precisamente porque había llegado a la misma conclusión que tú has puesto en tu mensaje.

Saludos.

guillotmarc
24-10-2003, 20:35:08
Gracias por añadir la aclaración. Al no ver el primer mensaje, ya me estaba preguntando si estoy empezando a ver visiones :D :D Ya había llegado a la conclusión que es hora de dejar el Ordenador y ir a casa ;)

Saludos.

Carlitos
27-10-2003, 09:46:36
Graicas,

Tu respuesta era lo que quería saber: un select sobre una vista se aplica tras la creación por parte del servidor de la vista y luego aplica la clausula where. Evidentemente esto para mí es muy importate ya que la aplicación debe procesar millones de registros. Por ejemplo, si tengo una vista que procesa 2 millones de registros y como resultado me devuelve 1 millón y a esta vista la aplico otro where que me devuelve 1000 registros, está claro que he procesado 3 millones de registros (primero 2 y luego 1), mientras que con el procedimiento almacenado procesaría 2 millones y obtendría directamente el resultado.

Gracias de nuevo...

guillotmarc
27-10-2003, 11:12:09
Hola.

Si tienes los índices adecuados, no procesas todos los registros, sinó solo los que se van a devolver. Los indices le permiten al motor ir directamente a los registros que va a devolver, sin necesidad de considerar siquiera el resto. Así pues en la vista solo se procesarian 1 millón de registros, y en el procedimiento almacenado 100.000.

La verdad es que creo que seria mejor que hicieses tus propias pruebas, para tu caso. Puesto que mi vista era bastante compleja, dado que era el UNION de varias tablas. En el caso de que solo haya una tabla base de la vista, quizá si que el motor podrá optimizar adecuadamente la consulta.

Además mi prueba era con Firebird 1, quizá Firebird 1.5 ha añadido esa optimización.

Saludos.