2012-04-16 33 views
0

理論的には、なぜ内部結合は非常に速く、両方のクエリが同じ結果セットを返すという事実を考慮して外部結合を残したのはなぜですか?私は説明に長い時間がかかるクエリを持っていましたが、これはシングルジョイントの変更を見たものです:左外部結合 - 6秒、内部結合 - 0秒(残りのクエリは同じです)。結果セット:同じSQL Serverの速度:左外部結合対内部結合

+9

実行計画を比較しましたか?あいまいな質問をすると、非常に具体的な結果が期待できないことを願っています。 –

+0

予期した結果が得られたら、最初にすべきことは、統計情報(およびインデックス)が最新であることを確認することです。 –

+0

@Aaron Bertrandはい、申し訳ありませんが詳細を与えることはできません。実行計画は異なって見えますが、私はそれらをうまく読みません。とにかく私はたぶん、これには一般的な理由があると思った... – ren

答えて

1

が実際に外部結合左と内側、データに依存する可能性がより多くの結果を持って参加して、再度データに依存外側左同じresults..mostを返さないと参加..

+1

なぜこれが答えでありコメントではないのか分かりません。右側の表に一致する行がない場合には、左結合によってさらに多くの結果が返される可能性がありますが、OPでは、そのケースでは2つの行が同じ行を生成することを明確に示しています。これは不正な形式のクエリ(たとえば、適切な場所にない結合/フィルタ条件)が原因である可能性がありますが、右側の表に一致するものがない左側の表に行がないことが考えられます。 –

0

私は、左の結合を内的な結合に変更しても結果は変わらないと心配しています。私はあなたがwhere句のテーブルの左側にある条件を有効に(おそらく間違って)インナー・ジョインに変えていると考えています。だから、最初私は私のクエリがそもそも間違っていました、そして、私は心配だろうと心配されるだろう

select * 
from table1 t1 
left join table2 t2 
on t1.myid = t2.myid and t2.somefield = 'something' 

と同じものではありません

select * 
from table1 t1 
left join table2 t2 on t1.myid = t2.myid 
where t2.somefield = 'something' 

:よう

何かパフォーマンス。内部結合はNOTです。左結合のパフォーマンスが向上していることは、2つの異なることを意味し、すべてのレコードに常に一致するテーブルがない限り、異なる結果を返さなければなりません。この場合、パフォーマンスを向上させるために間違っているため、内部結合に変更します。

左結合に時間がかかる理由は、where節によってフィルタリングされるより多くの行に結合しているということです。しかしそれはただの野生の推測です。あなたが実行計画を見る必要があることを知るために。

+0

一般的に私は同意しますが、公平であるために、今日はデータが「INNER JOIN」に適合していても「LEFT OUTER JOIN」というクエリを作成しました。今日の結果は必ずしも結果が常に得られるものではない後で導入された(または過去に存在した)不一致の行が存在する可能性があります。だから、私は内側と外側の結合が今日同じ結果を生み出すのであれば、あまりにも大きな音を鳴らす傾向はありません。実行計画が異なるという事実は、結合キーワードだけでなく、2つのクエリの間に分散があると信じるようになります。 –