我在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兆字节的原始数据,而忽略了协议中的任何管理开销。我认为一分钟的数据就可以了-花费很长时间才能将大量信息通过网络从服务器传输到计算机,这意味着您的查询几乎必须立即分发结果。减少结果集,您的时间将会改善。