Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-10-2003
Carlitos Carlitos is offline
Miembro
 
Registrado: ago 2003
Posts: 22
Poder: 0
Carlitos Va por buen camino
Que es más eficiente, un procedimiento almacenado o un select de una vista

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...
Responder Con Cita
  #2  
Antiguo 24-10-2003
Avatar de SCORDOBA
SCORDOBA SCORDOBA is offline
Miembro
 
Registrado: ago 2003
Ubicación: Llano de Brujas. Murcia
Posts: 37
Poder: 0
SCORDOBA Va por buen camino
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.
__________________
Ven a Murcia y no solo pasaras calor.
Responder Con Cita
  #3  
Antiguo 24-10-2003
Carlitos Carlitos is offline
Miembro
 
Registrado: ago 2003
Posts: 22
Poder: 0
Carlitos Va por buen camino
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...
Responder Con Cita
  #4  
Antiguo 24-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
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
  #5  
Antiguo 24-10-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Hola,

Cita:
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.
Responder Con Cita
  #6  
Antiguo 24-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Gracias por añadir la aclaración. Al no ver el primer mensaje, ya me estaba preguntando si estoy empezando a ver visiones Ya había llegado a la conclusión que es hora de dejar el Ordenador y ir a casa

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 27-10-2003
Carlitos Carlitos is offline
Miembro
 
Registrado: ago 2003
Posts: 22
Poder: 0
Carlitos Va por buen camino
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...
Responder Con Cita
  #8  
Antiguo 27-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:23:02.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi