有效地为每位患者选择最新费用

Chr*_*ett 3 sql sql-server sql-server-2005

我在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)
Run Code Online (Sandbox Code Playgroud)

我希望为每个患者获得每个CPT代码的最新ApptCPT,但到目前为止我所获得的查询大约需要一分钟才能返回~7M行.

我目前的查询:

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
Run Code Online (Sandbox Code Playgroud)

示例输出:

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    
Run Code Online (Sandbox Code Playgroud)

如果我取出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
Run Code Online (Sandbox Code Playgroud)

任何人都有任何想法(希望)更快,更快?

Joe*_*orn 5

你想要每个12字节的700万条记录(假设每个ID列有32位整数 - 你的CPT代码可能更大,因为我的经验表明它们在某些情况下可以有文本组件).这是84兆字节的原始数据,忘记了协议中的任何管理开销.我认为该数据的一分钟非常好 - 只需将这么多信息从服务器通过网络线路传输到您的计算机,这意味着您的查询必须几乎立即分发结果.削减结果集,您的时间将会改善.