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 Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-09-2008
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Question usar vista o procedimiento almacenado

Hola amigos necesito su opinión experta, estoy usando firebird 2 lo que quiero saber para ustedes que es mejor usar una vista o un procedimiento almacenado, tengo la siguiente vista:

Código SQL [-]
CREATE VIEW NEW_VIEW(
    ID,
    FECHA,
    ID_PROVEEDOR,
    APENOM,
    ID_COMPRA,
    FECHAVENTA,
    ID_DOCUMENTO,
    DESC_DOCUMENTO,
    NUMDOCUMENTO,
    SUBTOTAL,
    ID_IMPUESTO,
    DESC_IMPUESTO,
    PORCEIMPU,
    IMPUESTO,
    TOTAL)
AS
SELECT
    T_DEVOLUCIONESPROVEEDOR.ID,
    T_DEVOLUCIONESPROVEEDOR.FECHA,
    T_DEVOLUCIONESPROVEEDOR.ID_PROVEEDOR,
    T_PROVEEDORES.APENOM,
    T_DEVOLUCIONESPROVEEDOR.ID_COMPRA,
    T_COMPRAS.FECHA,
    T_COMPRAS.ID_DOCUMENTO,
    T_DOCUMENTOS.DESCRIPCION,
    T_COMPRAS.NUMDOCUMENTO,
    /**********************/
    (select sum(v_detalledevolprovee.total) 
      from v_detalledevolprovee 
     where v_detalledevolprovee.id_devolucion = T_DEVOLUCIONESPROVEEDOR.ID),
    /**********************/
    T_DEVOLUCIONESPROVEEDOR.ID_IMPUESTO,
    T_IMPUESTOS.DESCRIPCION,
    T_DEVOLUCIONESPROVEEDOR.PORCEIMPU,
    /**********************/
    ((select sum(v_detalledevolprovee.total) 
       from v_detalledevolprovee 
      where v_detalledevolprovee.id_devolucion = T_DEVOLUCIONESPROVEEDOR.ID) * T_DEVOLUCIONESPROVEEDOR.PORCEIMPU),
    /**********************/
    ((select sum(v_detalledevolprovee.total) 
       from v_detalledevolprovee 
      where v_detalledevolprovee.id_devolucion = T_DEVOLUCIONESPROVEEDOR.ID) + 
      ((select sum(v_detalledevolprovee.total) 
          from v_detalledevolprovee 
        where v_detalledevolprovee.id_devolucion = T_DEVOLUCIONESPROVEEDOR.ID) * T_DEVOLUCIONESPROVEEDOR.PORCEIMPU))
    /**********************/

FROM T_DEVOLUCIONESPROVEEDOR
   INNER JOIN T_PROVEEDORES ON (T_DEVOLUCIONESPROVEEDOR.ID_PROVEEDOR = T_PROVEEDORES.ID)
   INNER JOIN T_COMPRAS ON (T_DEVOLUCIONESPROVEEDOR.ID_COMPRA = T_COMPRAS.ID)
   INNER JOIN T_DOCUMENTOS ON (T_COMPRAS.ID_DOCUMENTO = T_DOCUMENTOS.ID)
   INNER JOIN T_IMPUESTOS ON (T_DEVOLUCIONESPROVEEDOR.ID_IMPUESTO = T_IMPUESTOS.ID)
;

y el siguente procedimiento:
Código SQL [-]
CREATE PROCEDURE V_DEVOLUCIONESPROVEEDOR 
RETURNS (
    ID INTEGER,
    FECHA DATE,
    ID_PROVEEDOR INTEGER,
    APENOM VARCHAR(123),
    ID_COMPRA INTEGER,
    FECHACOMPRA DATE,
    ID_DOCUMENTO INTEGER,
    DESC_DOCUMENTO VARCHAR(20),
    NUMDOCUMENTO INTEGER,
    SUBTOTAL DECIMAL(15,2),
    ID_IMPUESTO INTEGER,
    DESC_IMPUESTO VARCHAR(10),
    PORCEIMPU DECIMAL(18,2),
    IMPUESTO DECIMAL(15,2),
    TOTAL DECIMAL(15,2))
AS
BEGIN
  FOR
    SELECT 
               T_DEVOLUCIONESPROVEEDOR.ID, 
               T_DEVOLUCIONESPROVEEDOR.FECHA, 
               T_DEVOLUCIONESPROVEEDOR.ID_PROVEEDOR, 
               T_PROVEEDORES.APENOM, 
               T_DEVOLUCIONESPROVEEDOR.ID_COMPRA, 
               T_COMPRAS.FECHA, 
               T_COMPRAS.ID_DOCUMENTO, 
               T_DOCUMENTOS.DESCRIPCION, 
               T_COMPRAS.NUMDOCUMENTO, 
               T_DEVOLUCIONESPROVEEDOR.ID_IMPUESTO, 
               T_IMPUESTOS.DESCRIPCION, 
               T_DEVOLUCIONESPROVEEDOR.PORCEIMPU
    FROM T_DEVOLUCIONESPROVEEDOR
       INNER JOIN T_PROVEEDORES ON (T_DEVOLUCIONESPROVEEDOR.ID_PROVEEDOR = T_PROVEEDORES.ID)
       INNER JOIN T_COMPRAS ON (T_DEVOLUCIONESPROVEEDOR.ID_COMPRA = T_COMPRAS.ID)
       INNER JOIN T_DOCUMENTOS ON (T_COMPRAS.ID_DOCUMENTO = T_DOCUMENTOS.ID)
       INNER JOIN T_IMPUESTOS ON (T_DEVOLUCIONESPROVEEDOR.ID_IMPUESTO = T_IMPUESTOS.ID)
    INTO :ID,
         :FECHA,
         :ID_PROVEEDOR,
         :APENOM,
         :ID_COMPRA,
         :FECHACOMPRA,
         :ID_DOCUMENTO,
         : DESC_DOCUMENTO,
         :NUMDOCUMENTO,
         :ID_IMPUESTO,
         : DESC_IMPUESTO,
         :PORCEIMPU
  DO
  BEGIN
    select sum(v_detalledevolprovee.total) from v_detalledevolprovee where v_detalledevolprovee.id_devolucion = :ID into :SUBTOTAL;
    impuesto = subtotal * porceimpu / 100;
    total = subtotal + impuesto;
    SUSPEND;
  END
END
los 2 hacen y funcionan exactamente igual, pero ustedes que prefieren usar, el procedimiento a mi me gusta mas porque se pueden usar variables encambio en la vista tengo que volver a escribir las subconsultas para cada vez que las necesitene, pero en cuestion de rendimiento que me aconsejan usar ustedes?

Gracias
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México

Última edición por jzginez fecha: 01-09-2008 a las 21:50:13.
Responder Con Cita
  #2  
Antiguo 01-09-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Por lo general es más eficiente un procedimiento almacenado, ya que permite el uso de variables, puede recibir parámetros, y es posible "suspenderlo" (pausarlo) durante el ciclo For Select para que el servidor y / o el cliente lleven a cabo otro procesamiento durante la generación del cursor. Además de que puede incluir prácticamente todo tipo de código SQL.

La principal desventaja de las vistas es que el servidor ejecuta TODA la consulta y mantiene el completo cursor en memoria antes de devolver el control al lado cliente.

Personalmente, recomiendo el uso de vistas sólo para cursores sencillos que siempre arrojarán un pequeño número de filas o cuya consulta no afecte el desempeño (por consumo de tiempo) de la interfaz de usuario.

Saludos.

Al González.

P.D. Un favor, ¿podrías cortar en varias líneas las sentencias de código más largas que escribiste para mejorar la lectura de tu mensaje? Gracias.
Responder Con Cita
Respuesta


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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
procedimiento almacenado JAI_ME Varios 5 02-09-2008 16:24:58
Procedimiento almacenado efelix MS SQL Server 7 21-11-2007 17:53:00
Procedimiento almacenado LucianoRey MS SQL Server 2 23-08-2005 00:37:06
Que es más eficiente, un procedimiento almacenado o un select de una vista Carlitos Firebird e Interbase 7 27-10-2003 11:12:09
procedimiento almacenado haron Firebird e Interbase 2 29-09-2003 01:09:56


La franja horaria es GMT +2. Ahora son las 18:46:07.


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