1

我有下面的 sql 语句,最多在 5 分钟内运行。当我向它添加任何连接时,sql 语句会一直运行直到超时。我想知道您是否可以让我知道为什么添加到 sql 语句会导致这种情况?这些是我添加到基本 SQL 的连接:

将此语句添加到 Base SQL

inner join ahsrelate.dbo.ahs_encounter ahs_encounter_1
on AHS_Encounter_1.PatientID=AHS_Patient.ID

或将此语句添加到基本 SQL

inner join AHS_Medication
on ahs_medication.patientid=AHS_Patient.ID

基础 SQL

SELECT distinct
    AHS_Patient.FullName, 
    AHS_Patient_Iorg.OrganizationMrn, 
    AHS_Patient.SexName, 
    AHS_Patient.DateOfBirth, 
    Finding1.NumericResult, 
    Finding2.NumericResult, 
    AHS_Problem.ICD9DiagnosisCode, 
    AHS_Encounter.EncounterDTTM, 
    AHS_Encounter.EncounterTypeName, 
    AHS_Result.EntryCode, 
    AHS_Result_1.EntryCode, 
    AHS_Result.NumericResult, 
    AHS_Result_1.NumericResult, 
    AHS_Result.ClinicalDTTM, 
    AHS_Result_1.ClinicalDTTM, 
    AHS_Provider.FullName, 
    AHS_Problem.Problem, 
    AHS_Problem.ProblemStatusName, 
    AHS_Encounter.ApptLocationName, 
    AHS_Encounter.AppointmentStatusName
FROM AHSRelate.dbo.AHS_Patient AHS_Patient 
      INNER JOIN AHSRelate.dbo.Finding1 Finding1 
        ON AHS_Patient.ID=Finding1.PatientID
          AND Finding1.EntryMnemonic='BP SYS'    
      INNER JOIN AHSRelate.dbo.Finding2 Finding2 
        ON AHS_Patient.ID=Finding2.PatientID 
        AND Finding2.EntryMnemonic='BP DIAS' 
      INNER JOIN AHSRelate.dbo.AHS_Result AHS_Result 
        ON AHS_Patient.ID=AHS_Result.PatientID
         AND AHS_Result.EntryCode IN ('D5353078', 'Q25015900') 
      INNER JOIN AHSRelate.dbo.AHS_Result AHS_Result_1 
        ON AHS_Patient.ID=AHS_Result_1.PatientID
          AND AHS_Result_1.EntryCode IN ('D5353037', 'Q25003000')
      INNER JOIN AHSRelate.dbo.AHS_Encounter AHS_Encounter 
        ON AHS_Encounter.PatientID=AHS_Patient.ID
        AND AHS_Encounter.AppointmentStatusName='Pending' 
          AND AHS_Encounter.EncounterTypeName='Appointment'
          and AHS_Encounter.EncounterDTTM >= getdate()-1
          and AHS_Encounter.EncounterDTTM <= getdate()+1            
      INNER JOIN AHSRelate.dbo.AHS_Problem AHS_Problem 
        ON AHS_Patient.ID=AHS_Problem.PatientID
      INNER JOIN AHSRelate.dbo.AHS_Patient_Iorg AHS_Patient_Iorg 
        ON AHS_Patient.ID=AHS_Patient_Iorg.PersonID
      inner JOIN AHSRelate.dbo.AHS_Provider AHS_Provider 
        ON AHS_Encounter.Provider2ID=AHS_Provider.ID
    ORDER BY 
    AHS_Patient.FullName, 
    AHS_Result.ClinicalDTTM DESC, 
    AHS_Result_1.ClinicalDTTM DESC
4

1 回答 1

1

我在不知道您的数据结构细节的情况下进行猜测,但根据我自己之前在医疗保健数据库方面的工作做出有根据的猜测。我看看这个,然后看看你的查询:

inner join AHS_Medication
on ahs_medication.patientid=AHS_Patient.ID

首先想到的是您有一个患者,他可能有多个问题、多次遭遇和多种药物,结果是您将不相关的事物连接在一起,因此产生的记录远多于说得通。5 分钟的查询时间已经很长了,我敢打赌,相对而言,药物表相当庞大,因此您将显着增加运行时间。

考虑您的患者:

Patient1
Patient2
Patient3

加入遭遇(假设每个患者有两次遭遇):

Patient1  Encounter1
Patient1  Encounter2
Patient2  Encounter3
Patient2  Encounter4
Patient3  Encounter5
Patient3  Encounter6

这很好,但随后您加入药物,该药物要么不在同一层次结构中,要么您遗漏了将药物与开处方的遭遇相关的加入标准(medication.PatientId && drug.EncounterWhichPrescibed)。如果 Patient1 有三种药物,则每次遇到都会重复,因为 Encounter 和 Medication 之间没有关系(或者至少您没有在加入标准中使用它)。

Patient1  Encounter1  MedicationA
Patient1  Encounter1  MedicationB
Patient1  Encounter1  MedicationC
Patient1  Encounter2  MedicationA
Patient1  Encounter2  MedicationB
Patient1  Encounter2  MedicationC
Patient2  Encounter3  MedicationD
Patient2  Encounter3  MedicationE
Patient2  Encounter3  MedicationF
Patient2  Encounter4  MedicationD
Patient2  Encounter4  MedicationE
Patient2  Encounter4  MedicationF
Patient3  Encounter5  MedicationG
Patient3  Encounter5  MedicationH
Patient3  Encounter5  MedicationI
Patient3  Encounter6  MedicationG
Patient3  Encounter6  MedicationH
Patient3  Encounter6  MedicationI

这种问题也可能发生在其他连接上,因此每个无意义的连接都在几何上增加了运行时间(即,使用单个连接可以轻松地将 5 分钟延长到 50 分钟)。

于 2013-02-14T00:11:46.157 回答