临时表VS表变量

时间:2018-01-22 17:32:28

标签: sql-server

我必须编写一个表函数,所以我在SQL Server中对查询进行了原型化并使用了一个临时表,但是当我将它更改为一个表变量时,查询来自于约。 1分钟到2个多小时。

第二个代码就是这个:

DECLARE @DETALLE TABLE
(
    FECHA smalldatetime,
    NO_OP NVARCHAR(100),
    MONTO FLOAT,
    PLAZO INT,
    CLIENTE NVARCHAR(100)
)

-- CALCULO EL PLAZO POR EL MONTO, EL CUAL SERA EL NUMERADOR --
--DROP TABLE #DETALLE
INSERT INTO @DETALLE
    SELECT 
        D.FECHA, D.NO_OP,
        MONTO = (D.CAPITAL+D.INTERESES)/1000000,
        PLAZO = CAST(D.FECHA_VCTO-D.FECHA AS INT),
        CLIENTE = CASE 
                     WHEN MIN_MAY = 'N' THEN 'MINORISTA'
                     WHEN M.ORIGEN = 'MESA LIQUIDEZ' THEN 'CLIENTE LIQUIDEZ'
                     WHEN M.ORIGEN IS NULL AND MIN_MAY = 'S' AND COD_SUCURSAL = '246' THEN 'EMPRESAS SALES'
                     ELSE 'OTRO MAYORISTA' 
                  END
    --INTO #DETALLE
    FROM 
        BCI_RIF_ODS.dbo.Tab_Detalle_DAP AS D 
    INNER JOIN 
        BCI_RI_ODS.dbo.Cliente_Traduce AS C ON (C.CLIENTE_ID = D.CLIENTE_ID)
    LEFT JOIN 
        BCI_RIF_ODS.dbo.TabMae_CliMesa AS M ON (D.CLIENTE_ID = M.CLIENTE_ID)
    WHERE 
        FECHA >= '20180101' AND FECHA_VCTO > FECHA

SELECT 
    D1.CLIENTE, D1.FECHA,
    NUMERADOR = SUM(D1.PLAZO*D1.MONTO),
    MONTO = D2.MONTO,
    FACTOR = SUM(D1.PLAZO*D1.MONTO)/D2.Monto
FROM
    @DETALLE D1 
LEFT JOIN
    (SELECT 
         CLIENTE, FECHA,
         MONTO = SUM(MONTO)
     FROM 
         @DETALLE
     GROUP BY 
         CLIENTE, FECHA) D2 ON (D1.CLIENTE = D2.CLIENTE AND D1.Fecha = D2.Fecha)
GROUP BY 
    D1.CLIENTE, D1.Fecha, D2.MONTO

1 个答案:

答案 0 :(得分:1)

您真的不需要再制作数据副本,然后才能执行汇总。你可以在这里使用cte代替。像这样的东西可能比将数据从一个表复制到变量要好得多。

with DETALLE as
(
    -- CALCULO EL PLAZO POR EL MONTO, EL CUAL SERA EL NUMERADOR --
    SELECT 
        D.FECHA, D.NO_OP,
        MONTO = (D.CAPITAL+D.INTERESES)/1000000,
        PLAZO = CAST(D.FECHA_VCTO-D.FECHA AS INT),
        CLIENTE = CASE 
                        WHEN MIN_MAY = 'N' THEN 'MINORISTA'
                        WHEN M.ORIGEN = 'MESA LIQUIDEZ' THEN 'CLIENTE LIQUIDEZ'
                        WHEN M.ORIGEN IS NULL AND MIN_MAY = 'S' AND COD_SUCURSAL = '246' THEN 'EMPRESAS SALES'
                        ELSE 'OTRO MAYORISTA' 
                    END
    FROM 
        BCI_RIF_ODS.dbo.Tab_Detalle_DAP AS D 
    INNER JOIN 
        BCI_RI_ODS.dbo.Cliente_Traduce AS C ON (C.CLIENTE_ID = D.CLIENTE_ID)
    LEFT JOIN 
        BCI_RIF_ODS.dbo.TabMae_CliMesa AS M ON (D.CLIENTE_ID = M.CLIENTE_ID)
    WHERE 
        FECHA >= '20180101' AND FECHA_VCTO > FECHA
)

SELECT 
    D1.CLIENTE, D1.FECHA,
    NUMERADOR = SUM(D1.PLAZO*D1.MONTO),
    MONTO = D2.MONTO,
    FACTOR = SUM(D1.PLAZO*D1.MONTO)/D2.Monto
FROM
    DETALLE D1 
LEFT JOIN
    (SELECT 
         CLIENTE, FECHA,
         MONTO = SUM(MONTO)
     FROM 
         DETALLE
     GROUP BY 
         CLIENTE, FECHA) D2 ON (D1.CLIENTE = D2.CLIENTE AND D1.Fecha = D2.Fecha)
GROUP BY 
    D1.CLIENTE, D1.Fecha, D2.MONTO