2017-09-25 5 views
1

JOINからmjnEmployeeDepartmentを除いて同じ2つのクエリがあります。最初のクエリはLEFT OUTER JOINを使用し、2番目のクエリはINNER JOINを使用します。どちらも同じデータを返しますが、INNER JOINの実行には4.5分かかりますが、LEFT OUTER JOINの実行には4秒かかります。誰でもここで起こっていることを示唆することはできますか?内部結合がクエリのパフォーマンスを無効にします

私はSMS 2017のコードをSQL 2012データベースに対して実行しています。

Select 
Count(*) --23878 00:00:00 

From 
     dbo.mjnEmployee as e 
       Inner Join dbo.mjnEmployeeStatus as s 
        on e.EmployeeID = s.EmployeeID 
       Inner Join dbo.mjnEmployeeEmploymentInfo as RankNo 
        On e.EmployeeId = RankNo.EmployeeID 
       Inner Join dbo.mjnEmployeeOfficeAssociation as Office 
        On e.EmployeeId = Office.EmployeeID 
       Inner Join dbo.mjnEmployeeEmploymentInfo as TrackNo 
        On e.EmployeeId = TrackNo.EmployeeID 
       Inner Join dbo.mjnEmployeeUnit as Unit 
        on e.EmployeeID = Unit.EmployeeID 
        And Unit.Iteration = 1 

       Left Outer Join dbo.mjnEmployeeDepartment as Department 
        on e.EmployeeID = Department.EmployeeID 

       Left Outer Join dbo.mjnEmployeeAssociation as Supervisor 
        On e.EmployeeId = Supervisor.ObjectEmployeeId 
        and Supervisor.EmployeeAssociationType = 2 
       Left Outer Join dbo.mjnEmployeeAssociation as Manager 
        On Manager.ObjectEmployeeId = e.EmployeeId 
        and Manager.EmployeeAssociationType = 1 
       Left Outer Join dbo.mjnEmployeeAssociation as Assistant 
        On e.EmployeeId = Assistant.ObjectEmployeeId 
        and Assistant.EmployeeAssociationType = 3 
       Left Outer Join dbo.mjnEmployeeAssociation as Advisor 
        On e.EmployeeId = Advisor.ObjectEmployeeId 
        and Advisor.EmployeeAssociationType = 4 

Select 
Count(*) --23878 00:04:37 

From 
     dbo.mjnEmployee as e 
       Inner Join dbo.mjnEmployeeStatus as s 
        on e.EmployeeID = s.EmployeeID 
       Inner Join dbo.mjnEmployeeEmploymentInfo as RankNo 
        On e.EmployeeId = RankNo.EmployeeID 
       Inner Join dbo.mjnEmployeeOfficeAssociation as Office 
        On e.EmployeeId = Office.EmployeeID 
       Inner Join dbo.mjnEmployeeEmploymentInfo as TrackNo 
        On e.EmployeeId = TrackNo.EmployeeID 
       Inner Join dbo.mjnEmployeeUnit as Unit 
        on e.EmployeeID = Unit.EmployeeID 
        And Unit.Iteration = 1 

       Inner Join dbo.mjnEmployeeDepartment as Department 
        on e.EmployeeID = Department.EmployeeID 

       Left Outer Join dbo.mjnEmployeeAssociation as Supervisor 
        On e.EmployeeId = Supervisor.ObjectEmployeeId 
        and Supervisor.EmployeeAssociationType = 2 
       Left Outer Join dbo.mjnEmployeeAssociation as Manager 
        On Manager.ObjectEmployeeId = e.EmployeeId 
        and Manager.EmployeeAssociationType = 1 
       Left Outer Join dbo.mjnEmployeeAssociation as Assistant 
        On e.EmployeeId = Assistant.ObjectEmployeeId 
        and Assistant.EmployeeAssociationType = 3 
       Left Outer Join dbo.mjnEmployeeAssociation as Advisor 
        On e.EmployeeId = Advisor.ObjectEmployeeId 
        and Advisor.EmployeeAssociationType = 4 
+0

私の最初の考えはインデックスの欠如です。 – duffymo

+0

私もDuffyですが、インナー結合だけでなく、左の結合も欠けていませんか?また、私は実行計画を見てSMSは新しいインデックスを示唆していません。 –

+2

ごくまれに[実際の実行計画を含める](https://stackoverflow.com/a/7359705/1260204)、[計画を貼り付ける](https://www.brentozar.com/pastetheplan)を使用することができます/)あなたの質問にリンクを共有してください。また、[あなた自身で読む](https://stackoverflow.com/a/759097/1260204)、おそらくあなたのクエリでパフォーマンスの問題を把握することができます。最後に、実行中のクエリとともに[schema DDL](https://en.wikipedia.org/wiki/Data_definition_language)を含めます。 – Igor

答えて

-1

内部結合と外部結合の違いを調べる必要があります。本質的に、内部結合は、外部結合がテーブルAのすべての行と、一致するテーブルBのすべての行を与える両方のテーブルに共通の行を与えます。

これは、内部結合が高速である理由を説明しています(データを知らなくても言い表せませんが)。違いはここに別の質問で本当によく示している

What is the difference between "INNER JOIN" and "OUTER JOIN"?

+0

INNER JOINは遅いです。だから私は混乱している。彼らは両方とも同じデータを返しますが、インナージョイントをほぼ100倍長く実行します。 –

+0

あなたの質問は、両方が同じデータを返しますが、INNER JOINは実行するのに4分かかりますが、LEFT OUTER JOINは4.5分かかるので、私の答えは – Ceaser1980

+0

BAHです!私は4秒をタイプすることを意味しました。私の悪い。 –

0

、テーブルの下に参加した結果、以前のセットですべての行を乗算するためにつながる句で行方不明に使用されるように思えます、

Inner Join dbo.mjnEmployeeDepartment as Department 
        on e.EmployeeID = Department.EmployeeID 

この列を持つ他のテーブルはありますか?はいの場合は、それを使用する必要があります。

+0

行が重複していません。両方のバージョンのクエリは、まったく同じデータを返します。 –

+0

これは、同じデータではなく、最初に左外部結合をクエリし、2番目のクエリでこのテーブルの内部結合を返します。 –

+0

同じデータです。この場合、両方のテーブルのデータは1-1の完全一致であるため、左結合と内部結合は同じ正確なデータセットを返します。その違いは、オプティマイザによって選択された実行計画にあります。 –

0

テーブルの並べ替えと、FORCESEEKオプティマイザヒントの組み合わせを使用して終了しました。条件付き結合表をすべての内部結合表の後に移動し、部門表の後にWITH(FORCESEEK)を追加しました。今はチャンピオンのように走っている。

関連する問題