全外连接非常慢

时间:2015-06-12 15:17:17

标签: sql sql-server

我有两张桌子。一个是今天的价格,一个是昨天的价格。有一个工作,每晚更新每个表。昨天的价格在更新之前是今天的副本。

我正在尝试创建一个表格,显示表格之间的差异。

为此,我使用完全外连接。我正在过滤我的标准,以使其更快,因为两个表都超过4800万行。

我目前的代码是这样的。

WITH differ AS 
(
    SELECT 
        tAP.CustomerID, tAP.ProductID, yAP.CustomerID AS 'Yest_CustomerID', yAP.ProductID AS 'Yest_ProductID',
        tAP.PDG, tAP.DiscPct1, tAP.DiscPct2, 
        yAP.DiscPct1 AS 'Yest_DiscPct1',
        yAP.DiscPct2 AS 'Yest_DiscPct2',
        CONVERT(DECIMAL(18,2),tAP.DiscPct1 - yAP.DiscPct1) AS 'DiscPct1_Difference',
        CONVERT(DECIMAL(18,2),tAP.DiscPct2 - yAP.DiscPct2) AS 'DiscPct2_Difference', 
        tAP.internalSPANumber, yAP.internalSPANumber AS 'Yest_InternalSPANumber', tAP.SPAUniqueReference,
        tAP.Project, 
        tAP.ExpiryDate,tAP.Subaddress, tAP.PriceType, yAP.PriceType AS 'Yest_PriceType', tAP.ListPrice, 
        tAP.NettPrice, yAP.NettPrice AS 'Yest_NettPrice',
        CONVERT(DECIMAL(18,2),tAP.NettPrice- yAP.NettPrice) AS 'NettPrice_Difference'

    FROM tbl_Prices tAP FULL OUTER JOIN tbl_Prices_Yesterday yAP ON tAP.CustomerId = yAP.CustomerID AND tAP.ProductID = yAP.ProductID
                 AND tAP.PDG = yAP.PDG AND tAP.Project = yAP.Project AND tAP.PriceType = yAP.PriceType

    WHERE   (((tAP.DiscPct1 <> yAP.DiscPct1) 
            OR (tAP.DiscPct2 <> yAP.DiscPct2)
            OR (yAP.CustomerID IS NULL)
            OR (tAP.CustomerID IS NULL)
            OR (tAP.NettPrice <> yAP.NettPrice)
            OR (tAP.InternalSPANumber <> yAP.InternalSPANumber))

            AND 
            (
                tAP.ProductID = '10238610' OR tAP.ProductID = '10238620'
                OR tAP.ProductID = '10238621' OR tAP.ProductID = '10238687' 
                OR tAP.ProductID = '10238688' OR yAP.ProductID = '10238610'
                OR yAP.ProductID = '10238620' OR yAP.ProductID = '10238621'
                OR yAP.ProductID = '10238687' OR yAP.ProductID = '10238688')
            ) 
)

SELECT * INTO tbl_Difference FROM differ

无论如何要加快速度?

1 个答案:

答案 0 :(得分:2)

在尝试使用AND过滤器在哪里加入它们之前,你可以过滤掉2个大表吗?

WITH tAPcte AS 
(
    SELECT * -- fields you need
    FROM   tbl_Prices
    WHERE  ProductID IN ('10238610',
                         '10238620',
                         '10238621',
                         '10238687',
                         '10238688')

),
yAPcte AS
(
    SELECT * -- fields you need
    FROM   tbl_Prices_Yesterday
    WHERE  ProductID IN ('10238610',
                         '10238620',
                         '10238621',
                         '10238687',
                         '10238688')
)
differ AS 
(
    SELECT 
        tAP.CustomerID, tAP.ProductID, yAP.CustomerID AS 'Yest_CustomerID', yAP.ProductID AS 'Yest_ProductID',
        tAP.PDG, tAP.DiscPct1, tAP.DiscPct2, 
        yAP.DiscPct1 AS 'Yest_DiscPct1',
        yAP.DiscPct2 AS 'Yest_DiscPct2',
        CONVERT(DECIMAL(18,2),tAP.DiscPct1 - yAP.DiscPct1) AS 'DiscPct1_Difference',
        CONVERT(DECIMAL(18,2),tAP.DiscPct2 - yAP.DiscPct2) AS 'DiscPct2_Difference', 
        tAP.internalSPANumber, yAP.internalSPANumber AS 'Yest_InternalSPANumber', tAP.SPAUniqueReference,
        tAP.Project, 
        tAP.ExpiryDate,tAP.Subaddress, tAP.PriceType, yAP.PriceType AS 'Yest_PriceType', tAP.ListPrice, 
        tAP.NettPrice, yAP.NettPrice AS 'Yest_NettPrice',
        CONVERT(DECIMAL(18,2),tAP.NettPrice- yAP.NettPrice) AS 'NettPrice_Difference'

    FROM tAPcte tAP FULL OUTER JOIN yAPcte yAP ON tAP.CustomerId = yAP.CustomerID AND tAP.ProductID = yAP.ProductID
                 AND tAP.PDG = yAP.PDG AND tAP.Project = yAP.Project AND tAP.PriceType = yAP.PriceType

    WHERE   (((tAP.DiscPct1 <> yAP.DiscPct1) 
            OR (tAP.DiscPct2 <> yAP.DiscPct2)
            OR (yAP.CustomerID IS NULL)
            OR (tAP.CustomerID IS NULL)
            OR (tAP.NettPrice <> yAP.NettPrice)
            OR (tAP.InternalSPANumber <> yAP.InternalSPANumber))
)

SELECT * INTO tbl_Difference FROM differ