Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

 
 
Herramientas Buscar en Tema Desplegado
  #4  
Antiguo 24-10-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 23:33:08.


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