1

最大5分で実行される以下のSQLステートメントがあります。結合を追加すると、タイムアウトになるまでsqlステートメントが実行されます。SQLステートメントに追加するとなぜこれが発生するのか教えていただけませんか?これらは、ベースSQLに追加した結合です。

このステートメントをベース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

出会いで参加(各患者に2回の出会いがあると仮定):

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

これは問題ありませんが、同じ階層にないか、処方されたエンカウンター (medication.PatientId && drug.EncounterWhichPrescibed) に薬を関連付ける結合基準を省略した薬と結合します。患者 1 が 3 つの薬を服用している場合、遭遇と投薬の間に関係がないため (または少なくとも結合基準で使用していないため)、遭遇ごとに複製されます。

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

この種の問題は他の結合でも発生する可能性があり、無意味な結合ごとにランタイムが幾何学的に増加します (つまり、1 回の結合で 5 分から 50 分に簡単に短縮できます)。

于 2013-02-14T00:11:46.157 に答える