クエリ チューニングの高度な概念
Microsoft SQL Server では、インメモリの並べ替えとハッシュ結合テクノロジを使用して、並べ替え、積集合、和集合、および差集合の各演算が実行されます。SQL Server では、この種のクエリ プランを使用することで、テーブルの列分割がサポートされます。列分割は、列記憶と呼ばれることもあります。
SQL Server では、次の 3 種類の結合演算を使用します。
- 入れ子になっているループ結合
- マージ結合
- ハッシュ結合
一方の結合入力が少なく (たとえば 10 行未満)、他方の結合入力が多く、その結合列にインデックスが設定されている場合、インデックスの入れ子になったループが最も高速な結合演算です。入れ子になったループは I/O が最も少なく、比較が最も少なくなるためです。入れ子になっているループの詳細については、「入れ子になっているループ結合について」を参照してください。
2 つの結合入力が少なくない場合でも、結合列に基づいて並べ替えられている場合 (並べ替えられたインデックスのスキャンにより取得された場合など)、マージ結合が最も高速な結合演算です。両方の結合入力が多く、2 つの入力が同じようなサイズの場合、あらかじめ並べ替えられたマージ結合とハッシュ結合は同じようなパフォーマンスになります。ただし、2 つの入力サイズが大きく異なる場合、ハッシュ結合演算の方がはるかに高速になることが多くなります。詳細については、「マージ結合について」を参照してください。
ハッシュ結合は、並べ替えられておらず、インデックスが設定されていない大量の入力を効率的に処理できます。次のような理由から、ハッシュ結合は、複雑なクエリでの中間結果を得るのに役立ちます。
- 中間結果にはインデックスが設定されず (ディスクに明示的に保存した後インデックスを設定しない限り)、多くの場合、クエリ プランでの次の演算に合わせて並べ替えられることがありません。
- クエリ オプティマイザは、中間結果のサイズだけを予想します。複雑なクエリではこの予想が非常に不正確になる場合があります。そのため、中間結果を処理するアルゴリズムは効率的なだけでなく、中間結果が予想をはるかに上回る場合でも、パフォーマンスをあまり低下させないようにする必要があります。
ハッシュ結合では、非正規化の使用を減らすことができます。通常、非正規化は、結合演算を減らすことにより、パフォーマンスを向上させるときに使用します。ただし、不整合な更新など、データの冗長性が発生する恐れがあります。ハッシュ結合では、非正規化の必要性が減少します。ハッシュ結合では、列方向のパーティション分割 (単一テーブルの列グループを異なるファイルまたはインデックスに格納することを表します) を物理データベース デザインに利用できます。詳細については、「ハッシュ結合について」を参照してください。