2013-03-07 11 views
5

FULL JOINで2.5秒、INNER、RIGHTまたはLEFT JOINで40秒かかるクエリがあります。内/右/左ジョインがFULL JOINよりも14倍遅くなることはありますか?

ここにクエリがあります。副問合せ(2回実行)は、それ自身で1.3秒しかかかりません。日時のうち、MM文字列:

SELECT T1.[time], T1.Total, T1.rn, T2.[time], T2.Total, T2.rn 
FROM 
(
select [time], MAX(ComputedValue) as Total, row_number() over (order by [time]) as rn 
FROM 
(
    select SUBSTRING(CONVERT(CHAR(10), IntervalStartTime, 108), 0, 6) as [time], ComputedValue 
    from LoadTestTransactionSample 
    where LoadTestRunId=285 
    and CounterName='Total Transactions' 
    and TransactionName='Export' 
) foo 
group by [time] 
) T1 
_____ JOIN 
(
select [time], MAX(ComputedValue) as Total, row_number() over (order by [time]) as rn 
FROM 
(
    select SUBSTRING(CONVERT(CHAR(10), IntervalStartTime, 108), 0, 6) as [time], ComputedValue 
    from LoadTestTransactionSample 
    where LoadTestRunId=285 
    and CounterName='Total Transactions' 
    and TransactionName='Export' 
) foo 
group by [time] 
) T2 
ON T1.rn = T2.rn - 1 

select SUBSTRINGビットだけHHを得ています。 LoadTestTransactionSampleは、実際には8つのテーブルを結合するVIEWです。 (データベースはVisual Studio負荷テスト結果ストアです)。ここではその(関連)カラムです:

LoadTestRunId INT NOT NULL 
CounterName NVARCHAR(255) NOT NULL 
TransactionName NVARCHAR(64) NOT NULL 
IntervalStartTime DATETIME NOT NULL 
IntervalEndTime DATETIME NOT NULL 
ComputedValue REAL 

A FULL JOINを返します余分な不要な行、私は正しい答えを得るために権利を行うに参加する必要がありますか。

私は本当に(私は1つを持っている:テーブル変数使用SQL Server 2012の分析関数「LAG」へ プリフェッチサブクエリ、a1ex07 @おかげで)解決 を探していないよと、単にいくつかの理解 これらの結合タイプ間でパフォーマンスが極端に異なる可能性があるのは、です。


EDIT: はここslow right join query planfast full join query planです。彼らはスクリーンショットを投稿するには大きすぎます。

EDIT 2: 実際には、クエリ・プランは、右を持っているが、45%でJOINとFULLは、(実際に、それは悪いことよりも99%/ 1%を終わる)全く不正確であることが判明した55%、で登録しよう。私は実際の実行統計に頼らなければならないということです。

EDIT 3:遅いRIGHTため 統計は、JOIN:

(40 row(s) affected) 
Table 'LoadTestPerformanceCounterCategory'. Scan count 0, logical reads 37556, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounter'. Scan count 0, logical reads 176464, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestScenario'. Scan count 0, logical reads 176464, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestCase'. Scan count 0, logical reads 176464, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'WebLoadTestTransaction'. Scan count 0, logical reads 13411100, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterInstance'. Scan count 0, logical reads 36563718, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterSample'. Scan count 19721, logical reads 269657, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestRunInterval'. Scan count 41, logical reads 205, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 36754 ms, elapsed time = 36763 ms. 

統計FULL速いが、JOINのために:

(41 row(s) affected) 
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterCategory'. Scan count 0, logical reads 1832, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounter'. Scan count 0, logical reads 8608, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestScenario'. Scan count 0, logical reads 8608, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestCase'. Scan count 0, logical reads 8608, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'WebLoadTestTransaction'. Scan count 0, logical reads 654200, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterInstance'. Scan count 0, logical reads 1783596, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterSample'. Scan count 962, logical reads 13154, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestRunInterval'. Scan count 2, logical reads 10, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 1950 ms, elapsed time = 1944 ms. 

RIGHTを大規模により読み込み、以上のスキャンよりもやっているJOIN明らかに類似したクエリプランにもかかわらず、FULL JOIN。

作業台(FULL JOINで)ヒント?それは一時テーブルですか?

これは、クエリオプティマイザが壊れていることを示唆しているようですか?

+1

であなたのクエリプラン/表示の統計情報を設定してご覧ください。 DDLスクリプトを使用してスキーマとデータを複製することができなければ、どの答えも基本的には推測になります。また、これらのパフォーマンスの数字は、後続のクエリと同じように最初のクエリで異なりますか?これは、キャッシュが関与していることを示しています。 – Heather

+1

Heatherは、1-2-3-4を実行してから4-3-2-1を入力し、 –

+1

を比較することを意味します。また、クエリの各バージョンはキャッシュ内に独自のクエリプランを生成します。同時にリフレッシュされます。これは時々パフォーマンスの問題を引き起こす可能性があります。 –

答えて

2

OK、それは答えです:悪いDB統計。ひどい。のように、更新されたことはありません。

exec sp_updatestats; FTW。

[恥で頭を隠す]

1

これは、同様のクエリの実行計画です。テーブルは非常に小さいです。

Execution Plan

クエリ1

  • INNER JOINを使用します。
  • 実行計画は小さく見えます。
  • ただし、合計時間の62%を要します。

クエリ2

  • FULL JOINを使用します。
  • 実行計画が大きく見えます。
  • ただし、合計時間の38%を要します。

理由: INNERがHASHのMATCHを使用している私の場合には登録しよう。 FULL JOINはNESTED LOOPを使用しています。これは、SQLオプティマイザによって物理的結合を使用する必要があることが決定されます(ただし、他の物理的結合を使用することもできます)。あなたの実行計画をチェックすれば、それは助けになるでしょう。

+1

これらのテーブルのインデックスによってはメリットがあります。 – DaveShaw

+0

@DaveShaw:はい、正しいです。 –

+0

@RaviSingh:不思議なことに、クエリプランが実行と一致しないようです!私の編集を参照してください - プランは、右ジョインとフル・ジョインの45%/ 55%の比率を期待していますが、実行は99%/ 1%になります。 – agentnega

関連する問題