额外加入会降低性能

时间:2013-02-13 23:43:37

标签: sql sql-server join

我的下面的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

1 个答案:

答案 0 :(得分: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

这很好,但是你加入了药物,这些药物要么不在同一层次结构中,要么你遗漏了将药物与处方药物相关的加入标准(药物,患者和药物治疗)。 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分钟)。