我在SQL Server 2005中拥有三个表(包括相关行):

Patient (560K rows, has many Appts)
    ID (PK, Clustered)
Appt (5.8M rows, has many ApptCPTs)
    ID (PK, Unique, Non-clustered)
    PatientID (Indexed, Non-unique, Non-clustered)
ApptCPT (13.4M rows)
    ID (PK, Clustered)
    ApptID (Indexed, Non-unique, Non-clustered)
    CPTID (Indexed, Non-unique, Non-clustered)

我想为每个患者的每个CPT代码获取最新的ApptCPT,但是到目前为止,我所需要的查询大约需要一分钟才能返回约700万行。

我当前的查询:
SELECT
    p.ID AS PatientID,
    MAX(ac.ID) AS ApptCPTID,
    ac.CPTID
FROM
    Patient p
INNER JOIN Appt a ON a.PatientID = p.ID
INNER JOIN ApptCPT ac ON ac.ApptID = a.ID
GROUP BY
    p.ID, ac.CPTID
ORDER BY
    p.ID, ac.CPTID

输出示例:
PatientID    ApptCPTID    CPTID
123456789    18627724     3088
123456789    7647238      3388
123456789    18627723     3419
123456789    9989220      3419
123456789    12190141     3448
123456789    18627721     3551
123456789    17264224     71020
123456789    15933265     77052
123456789    10095897     77057
123456789    5258166      77080
123456789    18627813     80053
123456789    18627814     80061

如果我取出MAX并将ac.ID放在GROUP BY子句中,则可以看到我在原始查询中获取了正确的数据,因为它正在获取包含该患者的CPTID的最后一个ApptCPT,但是速度非常慢。作为参考,以下是不使用MAX子句的相同输出:
PatientID    ApptCPTID    CPTID
123456789    18126508     3088
123456789    4596004      3088
123456789    18627724     3088
123456789    7647238      3388
123456789    18627723     3419
123456789    9989220      3419
123456789    12190141     3448
123456789    4595928      3551
123456789    9989218      3551
123456789    18627721     3551
123456789    17264224     71020
123456789    15933265     77052
123456789    10095897     77057
123456789    5258050      77057
123456789    5258166      77080
123456789    4595932      80053
123456789    18126505     80053
123456789    9989223      80053
123456789    18627813     80053
123456789    18627814     80061

任何人有任何想法(希望)更快,更快速地实现吗?

最佳答案

您希望有700万条记录,每个记录12个字节(假设每个ID列为32位整数-您的CPT代码可能更大,因为我的经验表明在某些情况下它们可以包含文本成分)。那就是84兆字节的原始数据,而忽略了协议中的任何管理开销。我认为一分钟的数据就可以了-花费很长时间才能将大量信息通过网络从服务器传输到计算机,这意味着您的查询几乎必须立即分发结果。减少结果集,您的时间将会改善。

10-02 02:08
查看更多