複数の結合を使用したクエリのチューニング


8

私はこのクエリを持っています.. 214実行/分、44.42平均CPU(ms)はそれをはるかに速くする方法があります

SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM    unicas_config..applicationForm AF  
  INNER JOIN UNICAS_CONFIG.. AcademicInstitution AI
           ON AF.casid=AI.casid 
  INNER JOIN UNICAS_CONFIG..Organization O 
           ON O.academicInstitutionid=AI.id   
  INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
           ON asOrg.FormId=AF.id
  INNER JOIN  UNICAS_CONFIG..Program P
           ON P.AssociationOrgId=asOrg.Id and asOrg.OrganizationId=O.id AND AF.Id = 6286
  INNER JOIN  unicas_config..ReferenceData RD 
                 ON P.STATE = RD.ValueId AND RD.ValueAbbr ='US'
  INNER JOIN  unicas_config..ReferenceDataSet RS  
           ON RD.ReferenceSetId = RS.SetId AND RS.NAME = 'LK_States'

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

これを2つのクエリに分割した場合

select RD.ValueId, RD.id into #temp1
from   unicas_config..ReferenceData RD
INNER JOIN  unicas_config..ReferenceDataSet RS   ON RD.ReferenceSetId= RS.SetId AND RS.NAME= 'LK_States'
where RD.ValueAbbr='US';


SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM    unicas_config..applicationForm AF  
  INNER JOIN UNICAS_CONFIG.. AcademicInstitution AI
           ON AF.casid=AI.casid 
  INNER JOIN UNICAS_CONFIG..Organization O 
           ON O.academicInstitutionid=AI.id   
  INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
           ON asOrg.FormId=AF.id
  INNER JOIN  UNICAS_CONFIG..Program P
           ON P.AssociationOrgId=asOrg.Id and asOrg.OrganizationId=O.id AND AF.Id = 6286
  INNER JOIN    #temp1 RD ON P.STATE= RD.ValueId;

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

フリスビーが推奨するクエリを使用する

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ハッシュ結合の使用

ここに画像の説明を入力してください

ここに画像の説明を入力してください


クエリの実行に必要な時間はどれくらいですか?そして、なぜ毎分200回実行されるのですか?結果を一時テーブルに頻繁に保存する必要性を説明できますか?
ypercubeᵀᴹ

このクエリはSPにあり、一時テーブルは次のクエリで使用されます。このプロダクションでは、1分あたり約20 Kのリクエストがあります。
2015

回答:


2

これを試してください
結合条件が(潜在的に)誤って配置されています

SELECT        P.Id id0,
              P.ProgramId ProgramId1,
              P.ProgramName ProgramName2,
              P.ProgramLevel ProgramLevel3,
              P.Department Department4,
              P.Track Track5,
              P.AcademicYear AcademicYear6,
              P.StartTerm StartTerm7,
              P.Delivery Delivery8,
              P.Fee Fee9,
              P.City City10,
              P.STATE State11,
              P.StartDate StartDate12,
              P.Deadline Deadline13,
              P.DeadlineDisplay DeadlineDisplay14,
              P.ProgramType ProgramType15,
              O.Id as OrganizationId16,
              O.NAME OrganizationName17,
              P.ApplicationType ApplicationType18,
              P.Concentration Concentration19,
              P.ZipCode ZipCode20,
              P.Campus Campus21,
              P.WADisplayName WADisplayName22,
              P.UpdatedDate updateDate23,
              AF.Id InstanceId24,
              RD.Id stateId33
INTO #TempGetFullProgramSelectionInfo            
FROM       UNICAS_CONFIG..Organization O                 
INNER JOIN UNICAS_CONFIG..AcademicInstitution AI
            ON AI.id = O.academicInstitutionid        
INNER JOIN unicas_config..applicationForm AF
            ON AF.casid = AI.casid  
           AND AF.Id = 6286   
INNER JOIN UNICAS_CONFIG..AssociationOrg asOrg
            ON asOrg.FormId         = AF.id
           and asOrg.OrganizationId = O.id
INNER JOIN UNICAS_CONFIG..Program P
            ON P.AssociationOrgId = asOrg.Id 
INNER JOIN unicas_config..ReferenceData RD 
            ON RD.ValueId = P.STATE  
           AND RD.ValueAbbr ='US'
INNER JOIN unicas_config..ReferenceDataSet RS  
            ON RS.SetId = RD.ReferenceSetId   
           AND RS.NAME = 'LK_States'

#tempにインデックスがある場合、最も意味のあるものでソートします


それでも応答が改善されない場合は、すべてに対してハッシュ結合を強制するだけです。それでも私の回答で選択を使用してください-上記のクエリにハッシュを追加してください

INNER HASH JOIN

私はあなたのクエリを試しましたが、あまり改善はありません。また、本番環境でINNER Hash Joinを使用することはお勧めしません。また、私は「それでも私の回答で選択を使用する」という意味を理解できませんでした
sebeid

あまり改善されていません-それは悪いことですか?本番環境でINNER Hash Joinを使用することはお勧めしませんか?どこで聞いたの?ニヤニヤしてみませんか?
パパラッツォ

実行プランを..に追加しました。このクエリは、本番環境で最もCPUとIOを消費します。私がより長い期間とより多くの書き込みと同じCPUを取得している数に基づいて
15

stackoverflow.com/questions/800124/… ..しかし、私はそれを試して、あなたに知らせます。ありがとう
sebeid

AF.Id = 6286はクエリでハードコード化されていません。これはSPに渡されるパラメーターです。テストのためにこの番号を使用しました
sebeid

1

次のインデックスを作成してみてください(まだ存在しない場合)

CREATE INDEX ix_Organization_academicInstitutionid
    ON Organization(academicInstitutionid, Id) INCLUDE (Name)

academicInstitutionidとIDのClustredインデックスの非クラスタ化インデックスが...そこにある
sebeidは

具体的には、academicInstitutionidのインデックスにインクルード(名前)がありますか?
ケネスフィッシャー

はい名前も含まれています.. 1つのインデックスまたは2つのインデックスのどちらでも問題ありません
sebeid

1
idにクラスター化インデックスがあり、academicInstitutionId include(name)に2番目のインデックスがあるということですか?先に進んで、複合インデックスを作成します。計画を見ると、それらのほとんどはクラスター化インデックスシークを行っています。代わりに、それをインデックスシークにしようとすることです。
ケネスフィッシャー

0

スクリプトを変更する前に、関連するすべてのテーブルでインデックスを再構築し、大幅な増加がないか確認してください。(少なくとも、フルスキャンでテーブルレベルの統計を再構築します)

[プログラム]は大きなテーブルのようです。P.AssociationOrgIdにインデックスが作成されていることを確認してください


私は毎日統計を再構築し、すべてのインデックスは再構築されました
sebeid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.