优化TSQL除外

时间:2013-11-14 14:00:26

标签: sql-server tsql

如果可以包含表MasterStaging(登台表)中的ID,我可以优化连接:

  • EXCEPT中包含ID会导致结果失真,因为ID中的MasterStaging将始终与StatusComparison不同
  • MasterStaging.ID无关紧要,只是一个自动编号,并不代表客户ID
  • SQL旨在显示缺少的客户,无论ID如何。
  • CustomerAccountNo不是唯一编号

如何获取ID top优化JOIN

这就是我想要的:

与以下相同的SQL,但我JOIN仅使用ID

) x ON e.ID = x.ID  

这是我到目前为止所做的:

UPDATE ecl.MasterStaging 
SET NewAccount = 1
    FROM ecl.MasterStaging e WITH (NOLOCK)
    JOIN (
          SELECT  
              ISNULL(Usable, 0) AS Usable ,
              ISNULL(TypeRC, 0) AS TypeRC ,
              ISNULL(CustomerNumber, 0) AS CustomerNumber ,
              ISNULL(CustomerAccountNo, 0) AS CustomerAccountNo ,
              ISNULL(LoadProfileClass, 0) AS LoadProfileClass ,
              ISNULL(MeterNo, 0) AS MeterNo ,
              ISNULL(PrimaryPhoneNumber, 0) AS PrimaryPhoneNumber ,
              ISNULL(CustomerName1, 0) AS CustomerName1 ,
              ISNULL(ServiceAddress1, 0) AS ServiceAddress1 ,
              ISNULL(ServiceCity, 0) AS ServiceCity ,
              ISNULL(ServiceState, 0) AS ServiceState ,
              ISNULL(ServiceZip, 0) AS ServiceZip ,
              ISNULL(BillingAddress1, 0) AS BillingAddress1 ,
              ISNULL(BillingCity, 0) AS BillingCity ,
              ISNULL(BillingState, 0) AS BillingState ,
              ISNULL(substring(BillingZip, 1, 5), 0) as BillingZip ,
              ISNULL(substring(BillingZip4, 7, 4), 0) as BillingZip4
          FROM    
              ecl.MasterStaging WITH (NOLOCK)           

          EXCEPT

           SELECT  Usable ,
            TypeRC ,
            CustomerNumber ,
            CustomerAccountNo ,
            LoadProfileClass ,
            MeterNo ,
            PrimaryPhoneNumber ,
            CustomerName1 ,
            ServiceAddress1 ,                   
            ServiceCity ,
            ServiceState ,
            ServiceZip ,
            BillingAddress1 ,                   
            BillingCity ,
            BillingState ,
            BillingZip ,
            BillingZip4 
    FROM    ecl.StatusComparison  WITH (NOLOCK)
    WHERE   [Status] <> 'D'
            ) x
    ON 
            ISNULL(e.Usable,0) = x.Usable AND 
            ISNULL(e.TypeRC,0) = x.TypeRC AND 
            ISNULL(e.CustomerNumber,0) = x.CustomerNumber AND 
            ISNULL(e.CustomerAccountNo,0) = x.CustomerAccountNo AND
            ISNULL(e.LoadProfileClass,0) = x.LoadProfileClass AND
            ISNULL(e.MeterNo,0) = x.MeterNo AND
            ISNULL(e.PrimaryPhoneNumber,0) = x.PrimaryPhoneNumber AND
            ISNULL(e.CustomerName1,0) = x.CustomerName1 AND
            ISNULL(e.ServiceAddress1,0) = x.ServiceAddress1 AND 
            ISNULL(e.ServiceCity,0) = x.ServiceCity AND
            ISNULL(e.ServiceState,0) = x.ServiceState AND
            ISNULL(e.ServiceZip,0) = x.ServiceZip AND
            ISNULL(e.BillingAddress1,0) = x.BillingAddress1 AND
            ISNULL(e.BillingCity,0) = x.BillingCity AND
            ISNULL(e.BillingState,0) = x.BillingState AND
            ISNULL(e.BillingZip,0) = x.BillingZip AND
            ISNULL(e.BillingZip4,0) = x.BillingZip4

1 个答案:

答案 0 :(得分:1)

一个想法,但这可能不太理想:你可以在两个表上创建一个计算和持久列,它将计算所有列的校验和,你可以加入它。但是存在碰撞风险:

(我没有测试代码,让我知道是否有错误):

ALTER TABLE ecl.MasterStaging
ADD hash AS CHECKSUM(Usable ,
            TypeRC ,
            CustomerNumber ,
            CustomerAccountNo ,
            LoadProfileClass ,
            MeterNo ,
            PrimaryPhoneNumber ,
            CustomerName1 ,
            ServiceAddress1 ,                   
            ServiceCity ,
            ServiceState ,
            ServiceZip ,
            BillingAddress1 ,                   
            BillingCity ,
            BillingState ,
            BillingZip ,
            BillingZip4 ) PERSISTED

缺点:

  • more storage
  • 插入和更新期间的更多计算
  • 您需要更改表格的结构
  • 如果您需要在LOB上进行比较
  • ,它将无效