左连接的性能,并在查询中包含max,值为null

时间:2017-07-04 14:00:03

标签: sql sql-server

该表的数据超过70亿。 我想显示每个参与者的最大entryDate联盟,我想包括空值,所以我使用左连接,但查询需要很长时间。无论如何,它给了我预期的结果。 任何人都可以有更好的想法或其他更好的解决方案来解决这个问题吗?

Select ParticipantID,MaxDate
    From dbo.Participant Par
    LEFT JOIN dbo.Affiliation Aff
    ON AFF.ParticipantID=Par.ParticipantID
    LEFT JOIN (
                               SELECT              AFF.AffiliationID,
                                                      MAX(EntryDate) as MaxDate
                               FROM                dbo.Affiliation

                               GROUP BY            AFF.AffiliationID

                    )AS AFF1
           ON           AFF1.AffiliationID = AFF.AffiliationID
                        AND AFF1.MaxDate = AFF.EntryDate

2 个答案:

答案 0 :(得分:0)

我认为第一次加入是不必要的

SELECT ParticipantID, MaxDate
FROM dbo.Participant Par
OUTER APPLY (
    SELECT MAX(EntryDate) as MaxDate
    FROM dbo.Affiliation Aff
    WHERE Aff.ParticipantID = ParParticipantID
) A

您还需要Affilation上的索引:

CREATE INDEX IX_Affiliation_ParticipantID_EntryDate ON dbo.Affiliation(ParticipantID, EntryDate)

答案 1 :(得分:0)

@llyas如果您有xml show plan或者包含实际执行计划并检查子树成本,可能会有更多的考虑因素

无论如何,您可以使用row_num函数

来使用此查询
WITH par
AS (
    SELECT ParticipantID
        ,EntryDate AS MaxDate
        ,ROW_NUMBER() OVER (
            PARTITION BY AffiliationID ORDER BY ENTRYDATE DESC
            ) rn
    FROM dbo.Participant Par
    LEFT JOIN dbo.Affiliation Aff
        ON AFF.ParticipantID = Par.ParticipantID
    )
SELECT Participantid
    ,Maxdate
WHERE rn = 1