sql - 有效地选择每位患者的最新费用

标签 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)

我想为每位患者的每个 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/

相关文章:

sql - 获取 mysql 条目的列

mysql - 如何根据用户的定价计划限制用户添加新驱动程序

sql - 插入多个子查询作为值

python - django-pyodbc-azure 2.1.0.0 不支持 Django 2.1.0

sql-server-2005 - 存储过程的大小会影响其执行性能吗?

mysql - 加入什么用?

sql-server - 从 Powershell 调用存储过程后将其输出存储在文件中

c# - SQL如何将两个日期之间一小时内的事件求和并显示在一行中

sql - 如何将两个相同的数据库数据合并为一个?

Python MySql Select 语句。来自Python 条目的Where 列