SQL Server Joinクエリ

私は2つのテーブルを持っています。 1つは小さなテーブルで、もう1つは大きなテーブルです。 2つのテーブルの間で結合している間、どちらのテーブルを左に保持し、どのテーブルを右に置くと、クエリオプティマイザがより早く検索するか、またはテーブルにどこに参加するかは関係ありません。

例えば ​​:

--1
SELECT smalltable.column1,
       largetable.column1
  FROM smalltable
 INNER JOIN largetable
    ON smalltable.column1 = largetable.column1 ;
--2
SELECT smalltable.column1,
       largetable.column1
  FROM smalltable
 INNER JOIN largetable
    ON largetable.column1 = smalltable.column1 ;

どちらのクエリが速くなるか、それは問題ではありません。

1
それは...あなたのテーブル構造は何ですか?あなたが必要とする出力は何ですか?
追加された 著者 Yaqub Ahmad,
どのサーバーを使用していますか?
追加された 著者 Timofey Stolbov,
私はSQL Server 2008を使用しています
追加された 著者 akd das,

6 答え

Microsoft SQL Serverについて言えば、両方のクエリはクエリオプティマイザと同等です。実際、コストベースのほとんどのクエリオプティマイザにとって、それらは同等です。あなたは実行計画を見てみることができます(詳細は http: //www.simple-talk.com/sql/performance/execution-plan-basics/ )。

2
追加された
あなたの答えは@lloydomのものと直接矛盾します。コメントする気に?
追加された 著者 onedaywhen,
それはもっと哲学的な議論ですが、私は「オプティマイザにできる限り集中している」と言いがちです。この理由は2つあります。まず、将来行われる最適化は、「無料」のパフォーマンス向上のためです。第2に、コストベースのオプティマイザでは、DBMSが統計を計算するための作業を行う必要がある場合、実際の決定はあまり効果的ではなく、すでにデータを掘り下げなければなりません。今では、適切な統計を維持していないときに簡単に反対意見を述べることができますが、別の場所で対処すべきだと思います。それは好みの問題です。
追加された 著者 Stefan Mai,

最も適切なSQL Serverのバリアントのクエリオプティマイザはこれを解決します。いくつかのpritimitiveものはありません(クエリオプティマイザ - 古いMySQL、アクセス私の心に来る)。 SOmeは複雑な決定でオーバーレイされるかもしれません(これは簡単です)。

しかし、一般的には、まず問合せオプティマイザを信頼してください。

1
追加された

SQL Serverはクエリの実行を最適化する必要があるため、使用する順序は問わないはずです。ただし、(Microsoft SQL Serverを使用している場合は)SQL Server Profiler(SQL Server Management Studioの[ツール]メニューにあります)を使用して、両方のオプションの実行計画を確認できます。

1
追加された

Before running both the queries,select'Include Actual Execution Plan' from the menu & then run the queries. The Sql server will show the execution plan which is the best tool to create the optimized queries. See more about Execution Plan here.

0
追加された

結合列の順序は重要です。 この投稿詳細はこちらをご覧ください。また、このスレッドでのインデックス作成に関する議論はありませんでした。最適な結合表の順序と有用なインデックス作成を実行すると、実行クエリが最も速くなります。

0
追加された

テーブルの1つが他のテーブルよりも小さい場合。 小さなテーブルを最初に配置し、次に大きなテーブルを配置します。これにより、実行する作業が少なくなり、クエリ・オプティマイザがハッシュ結合を使用するプランを選択するのに役立ちます。 次に、クエリ・プロファイラーを実行し、ハッシュ・ジョインが使用されていることを確認します。これは、このシナリオでは、これが最善で最速です。 結合された表に索引がない場合、オプティマイザはハッシュ結合を選択します。 内部結合ステートメントの後にOPTION(HASH JOIN)を使用してハッシュ結合を強制することができます

MSDNからhttp://blogs.msdn.com/b/irenak/archive/2006/03/24/559855.aspx

テーブルを結合する列名はハッシュキーと呼ばれます。上記の例では、au_idになります。 SQL Serverは結合されている2つのテーブルを調べ、小さなテーブル(ビルド入力と呼ばれます)を選択し、ハッシュアルゴリズムをハッシュキーの値に適用するハッシュテーブルを作成します。各行は、ハッシュキーのために計算されたハッシュ値に応じて、ハッシュバケットに挿入されます。ビルド入力がメモリ内で完全に実行される場合、ハッシュ結合は「メモリ内ハッシュ結合」と呼ばれます。 SQL Serverにビルド入力全体を保持するための十分なメモリがない場合、プロセスはチャンク単位で行われ、「猶予ハッシュ結合」と呼ばれます。

0
追加された
あなたの答えは@Stefan Maiと直接矛盾します。コメントする気に?
追加された 著者 onedaywhen,
可能な限りオプティマイザを支援することが最善です。コンピュータリソースが限られているため、すべてを残すのは良い考えではありません。たとえば、4〜6回のテーブル結合を実行する場合、オプティマイザがベストを見つけるのに時間がかかりますそれ自身を計画してからクエリを実行すると、特定の時間内に応答し、古い計画を使用することができます。
追加された 著者 lloydom,