2016-12-27 6 views
6

JOINsの理解が正しいかどうかを確認しようとしています。テーブルジョイン中に実際に何が起こるのですか?

SELECT * FROM tableA 
    join tableB on tableA.someId = tableB.someId 
    join tableC on tableA.someId = tableC.someId; 

は、次のようにRDMSは、基本的には同様の擬似コードを実行します::次のクエリの場合

同じsomeIdtableA

List tempResults 
for each A_record in tableA 
    for each B_record in tableB 
     if (A_record.someId = B_record.someId) 
      tempResults.add(A_record) 

List results 
for each Temp_Record in tempResults 
    for each C_record in tableC 
     if (Temp_record.someId = C_record.someId) 
      results.add(C_record) 

return results; 

だから、基本的に複数のレコードを持っているtableBtableC、とRDMSにはさらにスキャンが記録されますか? 3つのテーブルすべてに同じsomeIdのレコードがある場合、3つのテーブルすべてで本質的に全テーブルスキャンが実行されますか?

私の理解は正しいですか?

+0

良い質問。しかし誰かがこれに答えることができるかどうかはわかりません。 ';)'間違いなく、同じことが背後で起きていると感じます。 –

+0

T-SQL結合ステートメントをもっと理解したいですか?この[結合](https://mva.microsoft.com/en-US/training-courses/querying-with-transactsql-10530?l=BooD4g87_7904984382)は、それらを理解するのに良い方法です。 – Edward

+0

[**この投稿は**](http://stackoverflow.com/questions/29795400/loop-join-in-sql-server-2008)ii有用です。 – Vikrant

答えて

4

もちろん、各ベンダーのクエリプロセッサはわずかに異なる方法で記述(コード化)されていますが、おそらく多くの一般的な手法を共有しています。結合の実装はさまざまな方法で行うことができます。どのベンダーの実装でもどちらを選択するかは、特定の状況に依存しますが、考慮する要素には、データがすでに結合属性によってソートされているかどうか、各テーブル内のレコードの相対数(1組のデータセット内の20レコード間の結合は、各レコードセットが同等のサイズのレコードとは異なるレコードになります)。 MySQLの内部構造はわかりませんが、SQLサーバーの場合は、マージ結合ループ結合、およびハッシュ結合という3つの異なる結合方法があります。 thisを見てください。

+0

私が提供した擬似コードは、*** Loop Join ***の例ですか? – Glide

+0

はい、あなたがしたのはループ結合です。この方法は、小さなセットを非常に大きなセットと結合する場合に適しています。あなたはもちろん小規模なものを反復し、各レコードについて大きなインデックスで一致を見つけるためのインデックスを使用します。 –

関連する問題