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