我在 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,但到目前为止我得到的查询大约需要一分钟才能返回约 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
示例输出:
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 兆字节的原始数据,忘记了协议(protocol)中的任何管理开销。我认为该数据的一分钟非常好——只需通过网络线路从服务器将这么多信息传输到您的计算机就需要这么长时间,这意味着您的查询必须几乎立即分发结果。减少你的结果集,你的时间就会得到改善。
关于sql - 有效地选择每位患者的最新费用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764773/