SQL查询的性能被join连接杀死

时间:2014-06-27 10:19:30

标签: tsql sql-server-2008-r2 query-optimization query-performance

我们在SQL Server 2008 R2中遇到查询性能问题。该查询连接来自2个数据库的表,一个是我们的数据集市从iSeries系统获取数据,另一个是我们的主要报告系统。

在下面的查询中,我们应该在不到30秒的时间内获得90939条记录。如果我们删除PO.POwner列,结果将在大约10秒内恢复。

但是当我们添加po.POwner列时,它就会杀死它。

  SELECT cu.* ,C4.C4IND, cu.CUS_Citizenship as [Country of Incorporation], 
  cu.CUS_Nationality as [Residence Country],[FirstParticipantID]=ISNULL(po.POwner,cu.CUS_No)
    -- , cu.CUS_No COLLATE Latin1_General_CS_AS, po.POwner COLLATE Latin1_General_CS_AS  
  FROM dbo.CustomerData cu 
    left outer join Hermes_Import.dbo.KFILDTO_C4PF C4 
        on cu.CUS_Type COLLATE Latin1_General_CS_AS =C4.C4CTP COLLATE Latin1_General_CS_AS
    OUTER APPLY (
        SELECT TOP 1 
            CASE WHEN GFCTP = 'GG' AND LEN(Y41SCV) > 5 THEN Y41SCV  ELSE Y41CUS END AS 'POwner', 
            GFCTP 
        FROM Hermes_Import.dbo.KFILDTO_Y41PF 
            INNER JOIN Hermes_Import.dbo.KFILDTO_GFPF ON GFCUS = Y41CUS 
        WHERE Y41TYP IN ('BN', 'BB', 'CO') AND Y41DEL = 0 AND Y41DEC = 0 
            AND Y41CUS COLLATE Latin1_General_CS_AS = cu.CUS_No COLLATE Latin1_General_CS_AS
        ) po 
    WHERE Left(Cu.[Cus_No],1)< '8' AND (cu.[CUS_Type])<>'ZA' AND DataDate='2014-04-30'  ORDER BY CUS_No

这是执行计划(仅限TOP 3000记录): enter image description here

当我们取出主要所有者列时,我们在大约11秒内得到所有结果,这是执行计划: enter image description here

我们可以采取哪些不同的方式来获得主要所有者,同时考虑到我们希望在客户帐户中最多可能有6个参与者的记录

1 个答案:

答案 0 :(得分:1)

当您注释掉po字段时,您没有表现不佳的原因是OUTER APPLY / TOP 1无论如何都可以保证产生一条记录。

如果您不关心此记录的内容,SQL Server也可以优化整个条款,它就是这样。

创建以下索引:

Hermes_Import.dbo.KFILDTO_Y41PF (Y41CUS, Y41DEL, Y41DEC, Y41TYP)
Hermes_Import.dbo.KFILDTO_GFPF (GFCUS)

此外,您在ORDER BY中使用的是没有OUTER APPLY的TOP 1。你确定你不关心你选择哪一条记录吗?