2016-11-10 4 views
1

私のクエリに問題があります。私はMS SQLで、患者からすべての関連テーブルを取得しようとしています。ここからすべてがうまくいっています。まずクエリを構築してから実行します。私がそれを実行すると、2分以上かかります。それは長すぎるそして私はすべての私のテーブルにインデックスを持っています。ここで私が達成しようとするものです。MS SQLすべてのテーブルが遅すぎるクエリ

ここに私のクエリはビルドアップだ:

select * from (   
     select (STUFF((
    SELECT ' ' + AA.LEFTJOIN 
    FROM (Select 'LEFT OUTER JOIN ' + A.name + ' WITH (NOLOCK) on (tbpatient.Id = ' + (A.name + '.' + B.Name) + ')' AS LEFTJOIN 
      from sysobjects A Join SysColumns B on (A.id = B.id) 
      Where B.name in ('IdPatient','ImageIdPatient') 
      And not A.name in ('tbrv','tbPatient','tbRV_ToExport','tbRV_Archive','tbRV_LOG_Archives','tbPatients_ToExport', 
      'tbPatientLock','tbPatient_FusionToExport','tbRV_LOG','tbPatient_A1','tbPatient_A2','tbPatient_A3','tbPatient_QVCDetail') 
      And a.type = 'U' And a.Name LIKE 'tb%') AA 
    FOR XML PATH('') 
    ), 1, 2, '') 
) AS query 
union all 
select (STUFF((
    SELECT ' ' + AA.WHERECLAUSE 
    FROM (Select ' And ' + '(' + A.name + '.' + B.Name + ') IS NULL ' AS WHERECLAUSE from sysobjects A Join SysColumns B on (A.id = B.id) 
      Where B.name in ('IdPatient','ImageIdPatient') 
      And not A.name in ('tbrv','tbPatient','tbRV_ToExport','tbRV_Archive','tbRV_LOG_Archives','tbPatients_ToExport', 
      'tbPatientLock','tbPatient_FusionToExport','tbRV_LOG','tbPatient_A1','tbPatient_A2','tbPatient_A3','tbPatient_QVCDetail') 
      And a.type = 'U' And a.Name LIKE 'tb%') AA 
    FOR XML PATH('') 
    ), 1, 2, '') 
) AS query) as AA 

それは戻っています:

を、私は私のコードで最初にこれを追加します。

Select tbPatient.Id, tbPatient.adresse1, tbPatient.nom, tbPatient.prenom From tbPatient " & _ 
             "Left Join tbRV A On (A.Idpatient = tbPatient.ID and A.DateRV >= GETDATE()) " & _ 
             "Left Join tbRV B On (B.Idpatient = tbPatient.ID and B.DateRV <= GETDATE() And B.Cloturer = 1) 

left join tbPatientLettres WITH (NOLOCK) on (tbpatient.Id = tbPatientLettres.IDPatient) 
left join tbPatientprofessionnel WITH (NOLOCK) on (tbpatient.Id = tbPatientprofessionnel.IDPatient) 
left join tbDossierPatient WITH (NOLOCK) on (tbpatient.Id = tbDossierPatient.IDPatient) 
left join tbPatient_CarnetVacXML WITH (NOLOCK) on (tbpatient.Id = tbPatient_CarnetVacXML.IDPatient) 
left join tbPatientDocuments WITH (NOLOCK) on (tbpatient.Id = tbPatientDocuments.IDPatient) 
left join tbPatientAttachements WITH (NOLOCK) on (tbpatient.Id = tbPatientAttachements.IDPatient) 
left join tbPatientMedecins WITH (NOLOCK) on (tbpatient.Id = tbPatientMedecins.IDPatient) 
left join tbNote WITH (NOLOCK) on (tbpatient.Id = tbNote.IdPatient) 
left join tbDossierIntervention WITH (NOLOCK) on (tbpatient.Id = tbDossierIntervention.IDPatient) 
left join tbPatientTaxe WITH (NOLOCK) on (tbpatient.Id = tbPatientTaxe.IdPatient) 
left join tbPatientModeleTaxe WITH (NOLOCK) on (tbpatient.Id = tbPatientModeleTaxe.IdPatient) 
left join tbPTI_Constat_Note_Evolution WITH (NOLOCK) on (tbpatient.Id = tbPTI_Constat_Note_Evolution.IDPatient) 
left join tbPTI_Constat_Eval WITH (NOLOCK) on (tbpatient.Id = tbPTI_Constat_Eval.IDPatient) 
left join tbPatient_OrdonnanceEntete WITH (NOLOCK) on (tbpatient.Id = tbPatient_OrdonnanceEntete.IDPatient) 
left join tbPatient_CarnetVac WITH (NOLOCK) on (tbpatient.Id = tbPatient_CarnetVac.IDPatient) 
left join tbPTIConstatSuivie WITH (NOLOCK) on (tbpatient.Id = tbPTIConstatSuivie.IDPatient) 
left join tbRNIComprimeEntete WITH (NOLOCK) on (tbpatient.Id = tbRNIComprimeEntete.IDPatient) 
left join tbPatient_QVCEntete WITH (NOLOCK) on (tbpatient.Id = tbPatient_QVCEntete.IDPatient) 
left join tbRNITeneursPatient WITH (NOLOCK) on (tbpatient.Id = tbRNITeneursPatient.IDPatient) 
left join tbPatient_QVCInfirmiere WITH (NOLOCK) on (tbpatient.Id = tbPatient_QVCInfirmiere.IDPatient) 
left join tbRNIResultat WITH (NOLOCK) on (tbpatient.Id = tbRNIResultat.IDPatient) 
left join tbPatient_QVCDestination WITH (NOLOCK) on (tbpatient.Id = tbPatient_QVCDestination.IDPatient) 
left join tbPatientRNI WITH (NOLOCK) on (tbpatient.Id = tbPatientRNI.IDPatient) 
left join tbPatient_CarnetVacRemarque WITH (NOLOCK) on (tbpatient.Id = tbPatient_CarnetVacRemarque.IDPatient) 
left join tbPatientImages WITH (NOLOCK) on (tbpatient.Id = tbPatientImages.ImageIDPatient) 
left join tbRVObjetQuestionnaire WITH (NOLOCK) on (tbpatient.Id = tbRVObjetQuestionnaire.IDPatient) 
left join tbPTI_Suivie_CLinique WITH (NOLOCK) on (tbpatient.Id = tbPTI_Suivie_CLinique.IDPatient) 
left join tbPatient_A4 WITH (NOLOCK) on (tbpatient.Id = tbPatient_A4.IDPatient) 
left join tbPatientRNIProtocole WITH (NOLOCK) on (tbpatient.Id = tbPatientRNIProtocole.IDPatient) 
left join tbPatient_D1 WITH (NOLOCK) on (tbpatient.Id = tbPatient_D1.IDPatient) 
left join tbPatient_C1 WITH (NOLOCK) on (tbpatient.Id = tbPatient_C1.IDPatient) 
left join tbPatientAssurance WITH (NOLOCK) on (tbpatient.Id = tbPatientAssurance.IdPatient) 
left join tbPatientContacts WITH (NOLOCK) on (tbpatient.Id = tbPatientContacts.IDPatient) 
left join tbPatient_B1 WITH (NOLOCK) on (tbpatient.Id = tbPatient_B1.IDPatient) 

私は私のVBのコードでこの句を追加します。私は2つのフィールドを連結し、私のクエリを実行したとき

And (tbPatientLettres.IDPatient) IS NULL  
And (tbPatientprofessionnel.IDPatient) IS NULL  
And (tbDossierPatient.IDPatient) IS NULL  
And (tbPatient_CarnetVacXML.IDPatient) IS NULL  
And (tbPatientDocuments.IDPatient) IS NULL  
And (tbPatientAttachements.IDPatient) IS NULL  
And (tbPatientMedecins.IDPatient) IS NULL  
And (tbNote.IdPatient) IS NULL  
And (tbDossierIntervention.IDPatient) IS NULL  
And (tbPatientTaxe.IdPatient) IS NULL  
And (tbPatientModeleTaxe.IdPatient) IS NULL  
And (tbPTI_Constat_Note_Evolution.IDPatient) IS NULL  
And (tbPTI_Constat_Eval.IDPatient) IS NULL  
And (tbPatient_OrdonnanceEntete.IDPatient) IS NULL  
And (tbPatient_CarnetVac.IDPatient) IS NULL  
And (tbPTIConstatSuivie.IDPatient) IS NULL  
And (tbRNIComprimeEntete.IDPatient) IS NULL  
And (tbPatient_QVCEntete.IDPatient) IS NULL  
And (tbRNITeneursPatient.IDPatient) IS NULL  
And (tbPatient_QVCInfirmiere.IDPatient) IS NULL  
And (tbRNIResultat.IDPatient) IS NULL  
And (tbPatient_QVCDestination.IDPatient) IS NULL  
And (tbPatientRNI.IDPatient) IS NULL  
And (tbPatient_CarnetVacRemarque.IDPatient) IS NULL  
And (tbPatientImages.ImageIDPatient) IS NULL  
And (tbRVObjetQuestionnaire.IDPatient) IS NULL  
And (tbPTI_Suivie_CLinique.IDPatient) IS NULL  
And (tbPatient_A4.IDPatient) IS NULL  
And (tbPatientRNIProtocole.IDPatient) IS NULL  
And (tbPatient_D1.IDPatient) IS NULL  
And (tbPatient_C1.IDPatient) IS NULL  
And (tbPatientAssurance.IdPatient) IS NULL  
And (tbPatientContacts.IDPatient) IS NULL  
And (tbPatient_B1.IDPatient) IS NULL 

where tbpatient.idstatut = 1 And A.Id is NULL And B.Id is NULLが、その後、それは2つ以上の分を取る...誰かが助ける方法を知っています物事?長いポストに感謝して申し訳ありません。

+1

「私はすべてのテーブルにインデックスを持っています。」(削除していない限り)プライマリキーを持っていると、デフォルトでテーブルにインデックスが作成されます。あなたが持っているインデックスを指摘することが重要かもしれません – Kritner

+1

ここに「どこ?」がないのですか?あなたのすべてのandsをあなたの参加に直接追加しているようです。さらに、左結合を行い、次にヌルをチェックしています - つまり、結合が正常に結合されなかったことを意味しますか?このクエリは、メインテーブルのレコードを他のテーブルにも存在しない場合にのみ、あなたに渡しますか? – Kritner

+0

@Kritnerそれはまさにそれがやることです。しかし、私は実際にこの目的を理解していません。 –

答えて

2

は、私はあなたのクリニックに行っていない患者を取得するには、以下のコードで物事を単純化することができると思う、と私はそれが良い仕事かもしれないと思う:

SELECT Id 
FROM tbpatient 
EXCEPT 
(SELECT IDPatient 
FROM tbPatientLettres 
UNION 
SELECT IDPatient 
FROM tbPatientprofessionnel 
UNION 
SELECT IDPatient 
FROM tbDossierPatient 
... and so on until you get all your tables in here 
) 

また、万が一、あなたドンがある場合IDPatient列のいずれかまたは一部にクラスタ化されていないインデックスがあります。これはもっと速くなければなりません。

+0

ありがとうとても速くなったので、今私はちょうどこれを今すぐ動的に構築する必要があります:) – alexandre

+0

@alexandre好奇心から、ちょっと助かりました。それはどのくらいかかりますか? –

+0

さて、4分前には4秒でした:) – alexandre