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