5

私は本を​​読んでいます。「Inside Microsoft SQL Server 2008: T-SQL Querying*」という本を読んでいます。この例では、2 つのテーブル間で結合を行うと、最初にデカルト積が発生し、次に ON 条件でフィルタリングされ、次に " RIGHT"、"LEFT"、または "FULL" 結合タイプ。

その本の例から、

SELECT C.customerid, COUNT(O.orderid) AS numorders
FROM dbo.Customers AS C
LEFT OUTER JOIN dbo.Orders AS O
ON C.customerid = O.customerid

Customer テーブルには 4 つの行があり、Orders には 7 つの行があります。したがって、最初のデカルト積は 4*7 = 28 行を生成し、次に "ON" 句と LEFT OUTER によってフィルターを取得します。

これは、使用する結合の種類に関係なく、テーブル間でデカルト積が発生するたびに発生するということですか? では、なぜ異なる結合間でパフォーマンスの違いが見られるのでしょうか?

4

3 に答える 3

5

SQL Server は確かに、すべての結合のデカルト積を計算してからフィルター処理するわけではありません。SQL ステートメントを左、右、内部で取得するだけです。指定した結合の種類が何であれ、オプティマイザーはどの物理結合演算子を使用するかについて、テーブルに存在する統計に基づいて決定します。

3 つの物理演算子があります。

  • ネストされたループの結合
  • マージ ジョイン
  • ハッシュ結合

3 つすべてに、最適に使用される独自の理想的なシナリオがあり (ここでは説明しません。これらのそれぞれについてはたくさんの記事があります)、結合に関係する各テーブルのカーディナリティの見積もりに大きく依存します。どの行が使用されているかに関して、オプティマイザが返すと予想される行数に関する統計。

Craig Freedman は、SQL サーバーで結合がどのように機能するかについて説明している素晴らしい一連のブログ投稿を行っています。これらはすべてここにあります。

参加 - クレイグ・フリードマン

そのリストの下位 5 つの記事を参照することをお勧めします。これらの記事には、結合の概要、結合プロパティの概要、および各物理結合演算子に関するかなり詳細な情報が含まれています。

于 2013-11-06T14:39:09.120 に答える
1

デカルト積が発生してフィルタリングされると言うのは、非常に誤解を招くものです。その場合、200 万行のテーブルを結合することは事実上不可能です。最初に、1 兆行の結果セットから始めて、それをフィルタリングすることになるからです。多くの SQL-Server 実装がそれを処理できませんでした。

したがって、いいえ、よく書かれたクエリの場合、デカルト積はプロセスの最初のステップではありません。不十分に書かれたクエリの場合、すべての賭けは無効になります。SQL-Server にその選択を強制することは可能ですが、それは間違いなく単純なプログラマ エラーの例です。

于 2014-06-27T22:35:10.523 に答える