我们在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记录):
当我们取出主要所有者列时,我们在大约11秒内得到所有结果,这是执行计划:
我们可以采取哪些不同的方式来获得主要所有者,同时考虑到我们希望在客户帐户中最多可能有6个参与者的记录
答案 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。你确定你不关心你选择哪一条记录吗?