Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   usar vista o procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=59580)

jzginez 01-09-2008 18:59:09

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

Al González 01-09-2008 20:03:58

¡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.


La franja horaria es GMT +2. Ahora son las 20:44:22.

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