Ver Mensaje Individual
  #4  
Antiguo 24-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Reputación: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita