Navicatブログ

ネストされた結合の説明 2022年5月26日 Robert Gravelle

全ての種類の結合を知っていると思っていたところに、別の結合が登場しました。おそらく、あなたは、ネストされた結合やネストされたループのクエリプランについて聞いたことがあり、それらが何であるか疑問に思ったことがあるでしょう。もう疑問に思う必要はありません。今日のブログで謎が一気に解決します!

用語の事例

リレーショナルデータベースの世界では、同じものに対して様々な名前が付けられることがあります。結合もこのルールの例外ではありません。実際、ネストされた結合に関しては、データベースの専門家の意見は異なります。そんなことはないと言う人もいます。他の人はより実用的で、それらが複数テーブル結合の単なる代替用語であることを認めています。

おそらく、この用語は、ネストされたループクエリプランを参照する時に発生しました。これらは、結合に応答するクエリエンジンによってよく使用されます。最も粗雑な形式では、ネストされたループは、次のようになります。

for all the rows in outer table 
  for all the rows in the inner table 
    if outer_row and inner row satisfy the join condition 
      emit the rows 
  next inner 
next outer

これは最も単純ですが、ネストされたループの最も遅いタイプでもあります。一方、複数テーブルのネストされたループ結合は、関連する全てのテーブルの行数の積が大きくなるにつれて、恐ろしくスケールアウトするため、パフォーマンスがさらに低下します。

ネストされたループのより効率的な形式は、nested-loop-over-indexです。

for all the rows that pass the filter from the outer table 
  use join qualifier from outer table row on index on inner table 
    if row found using index lookup 
      emit the rows 
next outer 

ネストされた結合の構文

「ネストされた結合」という用語が単に3つ以上のテーブル間の結合を指すことを確認したので、その構文を簡単に見てみましょう。

通常、複数のテーブルやビューを結合する必要がある場合は、次の一般的な形式を使用して、それらを1つずつリストします。

FROM  Table1 
[ join type ] JOIN Table2 
                ON condition2 
[ join type ] JOIN Table3 
                ON condition3 

しかし、これが唯一の方法ではありません。SQLの公式のANSI構文標準では、上記の結合を記述する別の有効な方法を提案しています。

FROM  Table1 
[ join type ] JOIN Table2 
[ join type ] JOIN Table3 
                ON condition3 
                ON condition2 

上記の結合スタイルを人間がより読みやすいものにするために、括弧とインデントを追加して意味をより明確にすることができます。

FROM  Table1 
[ join type ] JOIN ( Table2 
                    [ join type ] JOIN Table3 
                                    ON condition3 ) 
                ON condition2 

Table1に結合する前に、Table2とTable3の間の結合が最初に指定され、最初に実行する必要があることが簡単にわかります。このクエリスタイルでは、Table2とTable3の間の結合もネストされているように配置されます。実際、Table2とTable3の間の結合はネストされていると考えることができます。

以下は、両方のスタイルで記述されたNavicat Premiumの同じクエリです。

syntax_comparison (98K)

結論

今日のブログでは、「ネストされた結合」と「ネストされたループのクエリプラン」という用語に光を当てました。そのため、あなたが次にそれらを耳にする時には、どの構文が使用されているかに関係なく、単に複数のテーブルまたはビューの結合について言及しているだけであることがわかるでしょう。

ブログのアーカイブ
シェア