2017-09-05 3 views
2

以前の開発者が作成したアプリケーションを継承しました。データベースコールの中には、大量のデータがある場所では実行速度が遅いものがあります。私は一般的にはSQLコードがよく書かれているが、私には「何が?」と思う場所があることがわかった。ここでこの結合は複雑ですか?

は一例です:

select a.* 
from bs_ResearchEnquiry a 
left join bs_StateWorkflowState_Map b 
on (
    select c.MapId from bs_StateWorkflowState_Map c 
    where c.StateId = a.StateId AND c.StateWorkflowId = a.StateWorkflowId 
    )=b.MapId  
where 
    b.IsFinal=1 
  • MapIdフィールドがbs_StateWorkflowState_Mapテーブルに一意の主キーです。
  • およびStateWorkflowIdも一意のキーを形成する。
  • 常にそのため、私のように、安全に左をより効率的に参加書き換え、および可能性がbs_ResearchEnquiry

外部テーブル内の行にこれらのキーの試合があります:

inner join bs_StateWorkflowState_Map b 
on b.StateId = a.StateId AND b.StateWorkflowId = a.StateWorkflowId 

またはWAS私が逃した何かを達成しようとしている元の開発者?

+0

UPDATEを:私はちょうど単純に参加しようとしています反対の効果を見つける!実行時間が数秒から1分以上に増加しました。したがって、元の構文が過剰に設計されているように見えますが、開発者が最も効率的な方法を使用していた可能性があります。なぜこれが当てはまるのかまだ分かりません。 – userSteve

+0

は[クエリプラン](https://stackoverflow.com/a/7359705/50552)をご覧ください。 'left join'を維持すると、パフォーマンスは向上しますか? – Andomar

+0

@Andomarはい、左の結合は物事を改善します。 インナーと私の構文が参加左に90秒 私の構文をとりましょう私の目的は、<2秒 – userSteve

答えて

4

あなたの簡素化は私によく見えます。

where b.IsFinal = 1 

outer joinが効果的にinner joinであることを意味しますの存在があることに注意してください。

0

与えられたキーについてのあなたの説明では、あなたが正しいです、クエリを簡略化することができます。関連するbs_StateWorkflowState_Mapレコードが最終的なbs_ResearchEnquiryのレコードを選択します。だから、EXISTSを使用します(。一意にあなたの説明から、私はすでに両方のテーブルの(StateId, StateWorkflowId)にインデックスが存在することが収集されていない場合、それらを作成します。)

select * 
from bs_ResearchEnquiry re 
where exists 
(
    select * 
    from bs_StateWorkflowState_Map m 
    where m.StateId   = re.StateId 
    and m.StateWorkflowId = re.StateWorkflowId 
    and m.IsFinal = 1 
); 

+0

SQL Serverでは、IN句の複数のフィールドが無効です。代わりに 'EXISTS'を使うことができます。 – Rokuto

+0

ここで(x、y)は...無効ですSQL – userSteve

+0

@Rokuto:まあ、見つかった。私はいつもSQL Serverのこの制限を忘れています。これは本当にいくつかのクエリを読みにくくします。私は更新します。 –

関連する問題