3

2つのクエリの違いは何ですか?

   SELECT     CountryMaster.Id
   FROM       Districts INNER JOIN
   CountryMaster ON Districts.CountryId = CountryMaster.Id

   SELECT     CountryMaster.Id
   FROM       CountryMaster INNER JOIN
   Districts ON Districts.CountryId = CountryMaster.Id  

出力は同じになることはわかっていますが、複雑なクエリや数十万行のような大量のデータを含むテーブルのテーブルと列の位置を無視すると、同じような劇的な影響があるかどうかを知りたいです。

4

2 に答える 2

8

何の違いもありません。結合の順序は関係ありません。データベースエンジン内のクエリオプティマイザは、2つのテーブルのデータに保存されている統計に基づいて、2つのテーブルのレコードを実際に処理するマージプランを決定します。
実際、多くの場合、クエリオプティマイザは、結合を使用してフレーズ化されたクエリの両方に対して、相関サブクエリでフレーズ化されたクエリの場合とまったく同じプランを生成します。
ここで私が学んだ教訓は次のとおりです。

常に、作成しようとしているプロセスの意味を最も明確に表す構文または表現から始め、クエリオプティマイザーがその仕事をすることを信頼してください。そうは言っても、クエリオプティマイザは完全ではないため、パフォーマンスの問題がある場合は、別の構造でクエリ表示プランを使用して、改善されるかどうかを確認してください...

内部結合と外部結合のパフォーマンスに関する簡単なコメント。内部結合が外部結合よりも本質的に高速であるというのは、単純に真実ではありません。相対的なパフォーマンスは、3つのタイプの処理結合のどれがクエリエンジンによって使用されるかに完全に依存します。
1.ネストされたループ結合、2。、マージ結合、または3.ハッシュ結合。
たとえば、ネストされたループ結合は、結合の一方の側のレコードのセットがもう一方の側よりも非常に小さく、大きいセットが結合列でインデックス付けされている場合に使用されます。この場合、小さい方のセットが「外側」側であると、外側の結合が速くなります。その理由は、ネストされたループ結合は、その小さいセットからレコードのセット全体を取得し、それぞれを繰り返し処理して、一致する大きいセットからレコードを見つけるためです。内部結合は、大きい方のセットで一致が見つからなかった場合に、小さい方の側から行を削除する2番目のステップを実行する必要があります。外側の結合は、この2番目のステップを実行しません。

可能な3種類の結合プロセスには、それぞれ独自の動作パターンがあります。詳細については 、ネストされたループ結合マージ結合、およびハッシュ結合 を参照してください。

于 2012-10-08T15:34:23.110 に答える
1

書かれているように、それらは同一です。チャールズからの素晴らしい答え。

実行プランが異なるかどうかを知りたい場合は、SSMSで実行プランを表示するだけです。

速度については、結合で使用される列にインデックスを付けます。
インデックスを維持する-断片化されたインデックスはそれほど効果的ではありません。
クエリプランは常に同じであるとは限りません。
クエリオプティマイザは統計を保持し、データのプロファイルが変更されると、最適なプランが変更される可能性があります。
何千もの行は多くありません。
数百万に達したら、インデックスと構文を(ヒントを使用して)調整します。
調整するのに十分なデータを取得する前に、数百万に達する必要がある場合があります。

同等で、場合によってはより高速なUNION演算子もあります。

結合ヒントループは対称ではないため、その場合、クエリプランは次の場合とは異なりますが、それでも同じ結果になります。

1つがPKテーブルの場合、私は常にそれを最初に置きます。
この場合、最初の速度は2番目の速度の2倍です。

select top 10 docSVsys.sID, docMVtext.fieldID
from docSVsys 
inner loop join docMVtext 
   on docMVtext.sID = docSVsys.sID
where docSVsys.sID < 100
order by docSVsys.sID, docMVtext.fieldID

select top 10 docSVsys.sID, docMVtext.fieldID
from docMVtext
inner loop join docSVsys 
   on docMVtext.sID = docSVsys.sID
where docSVsys.sID < 100
order by docSVsys.sID, docMVtext.fieldID

高度なクエリチューニングの概念

于 2012-10-08T19:35:08.347 に答える