SQL Engine Reference (v11)

制限の最適化

ここでは、制限内の式を利用するためにデータベース エンジンが使用する基本技術を詳細に説明します。データベース エンジンが実行する最適化のタイプを単純なものから複雑なものの順に下に示します。

データベース エンジンが使用する最適化技術を完全に理解することは、データベース エンジンでの最適なパフォーマンスを実現するクエリを構築するのに役立ちます。さらに、データベース エンジンがクエリを最適化するためにインデックスをどのように使用するかを理解することにより、一般的な使用で最高のパフォーマンスを提供するインデックスの構築方法を決定することができます。

単純化のために、下の説明ではまず 1 つのテーブルの列を参照する式について述べます。述部で 2 つの異なるテーブルの列を比較する結合条件を使用する最適化は単一テーブルの最適化の次に説明します。

ここで使用されている用語の定義については、用語を参照してください。

単一述部の最適化

制限の最適化の最も単純な形式は単一の述部を使用するものです。述部は、次の条件をすべて満たす場合、最適化に使用されます。

たとえば、最初のセグメントが列 c1 であるインデックスがあるとします。次の述部は最適化に使用されます。

c1 = 1 
c1 IN (1,2) 
c1 > 1  

LIKE 演算子は、2 番目のオペランドがワイルドカード以外の文字で始まる場合のみ最適化されます。たとえば、C2 LIKE 'ABC%' は最適化できますが、C2 LIKE '%ABC' は最適化されません。

閉じた範囲の最適化

閉じた範囲は、単一述部の最適化の条件をすべて満たす場合、最適化に使用されます。

たとえば、最初のセグメントが列 c1 であるインデックスがあるとします。次の閉じた範囲は最適化に使用されます。

c1 >= 1 AND c1 < 10 

変形論理和の最適化

変形論理和は、次の条件にすべて合致する場合、最適化に使用されます。

たとえば、最初のセグメントが列 c1 であるインデックスがあるとします。次の変形論理和は最適化に使用されます。

c1 = 1 OR (c1 > 5 AND c1 < 10) OR c1 > 20 

次の変形論理和は、すべての述部と閉じた範囲内で同一列が参照されていないため、このタイプの最適化には使用されません。

c1 = 1 OR (c1 > 5 AND c1 < 10) OR c2 = 1 

論理積の最適化

論理積は、次の条件にすべて合致する場合、最適化に使用されます。

たとえば、最初の 3 つのセグメントとして列 c1、c2、c3 をこの順序で持つインデックスがあるとします。次の論理積の配置は最適化に使用されます。

c1 = 1 AND c2 = 1 AND c3 = 1 
c1 = 1 AND c2 = 1 AND c3 >= 1 
c1 = 1 AND c2 > 1 

述部の順序は関係ありません。たとえば、次の論理積は最適化に使用されます。

c2 = 1 AND c3 = 1 AND c1 = 1 

次の論理積は、インデックスの 2 番目のセグメントが飛ばされているため(列 c2 への参照がない)、最適化には使用されません。

c1 = 1 AND c3 = 1 

この場合、単一の述部 c1 = 1 は最適化に使用されます。

論理和標準形の最適化

論理和標準形(DNF)の式は、次の条件をすべて満たす場合、最適化に使用されます。

データベース エンジンは、元から DNF にあった制限を変形 CNF に変換しません。これは DNF 上で最適化されるためです。

たとえば、最初の 3 つのセグメントとして列 c1、c2、c3 をこの順序で持つインデックスがあるとします。DNF の次の式は最適化に使用されます。

(c1 = 1 AND c2 = 1 AND c3 = 1) OR (c1 = 1 AND c2 = 1 AND 
c3 = 2) OR (c1 = 2 AND c2 = 2 AND c3 = 2) 

DNF の次の式は、両方の論理積が同数のセグメントを参照していないため、最適化に使用されません。

(c1 = 1 AND c2 = 1 AND c3 = 1) OR (c1 = 1 AND c2 = 2) 

変形論理積標準形の最適化

変形論理積標準形(変形 CNF)の式は、次の条件をすべて満たす場合、最適化に使用されます。

変形 CNF 最適化は DNF 最適化と似ていますが、DNF 最適化ではサポートされない、異なる比較演算子を含む述部の組み合わせを使用することができます。

たとえば、最初の 3 つのセグメントとして列 c1、c2、c3 をこの順序で持つインデックスがあるとします。変形 CNF の次の式は最適化に使用されます。

(c1 = 1 OR c1 = 2) AND (c2 = 1 OR (c2 > 2 AND c2 < 5)) 
AND (c3 > 1) 

変形 DNF 内の等号式に注目すると、データベース エンジンがこの式を最適化に使用する方法を簡単に理解できます。

(c1 = 1 AND c2 = 1 AND c3 > 1) OR (c1 = 1 AND (c2 > 2 AND 
c2 < 5) AND c3 > 1) OR (c1 = 2 AND c2 = 1 AND c3 > 1) 
OR (c1 = 2 AND (c2 > 2 AND c2 < 5) AND c3 > 1) 

変形 CNF 最適化で開いた範囲を閉じる

2 つの変形論理和は、次の条件を満たす場合、結合されて 1 つまたは複数の閉じた範囲を形成します。

たとえば、最初のセグメントが列 c1 であるインデックスがあるとします。変形 CNF の次の式は最適化に使用されます。

(c1 = 1 OR c1 > 2) AND (c1 < 5 OR c1 = 10) 

単純な変形論理和である等号式に注目すると、データベース エンジンがこの式を最適化に使用する方法が簡単に理解できます。

c1 = 1 OR (c1 > 2 AND c1 < 5) OR c1 = 10 

単一結合条件の最適化

2 つのテーブルにかかわる最適化の最も単純な形式は、単一の結合条件を利用するものです。単一の結合条件の最適化は単一述部の最適化に似ています。結合条件は、単一述部の最適化の条件をすべて満たす場合、最適化に使用されます。結合条件を使用して最適化されるテーブルは、結合条件内で参照されるほかのテーブルの後で処理されます。結合条件を使用して最適化されるテーブルは、結合条件内で参照されるほかのテーブルの行から取得した最適化値を使用します。

たとえば、テーブル t1 に最初のセグメントが列 c1 であるインデックスがあるとします。次の結合条件は最適化に使用されます。

t1.c1 = t2.c2 
t1.c1 > t2.c2 

最適化中、行はテーブル t2 から取得されます。この行から、列 c2 の値を使用して、結合条件に従ってテーブル t1 を最適化します。

t1.c1 のインデックスの代わりに t2.c2 のインデックスがある場合には、t1.c1=t2.c2 によってテーブル t2 を最適化できます。この場合、テーブル t1 が最初に処理され、t1.c1 の値を基に、結合条件に従ってテーブル t2 が最適化されます。

t1.c1 のインデックスだけでなく t2.c2 のインデックスも存在する場合には、データベース エンジンのクエリ オプティマイザーは両方のテーブルのサイズに加え、2 つのインデックスの特性も調べて、全体で最高のクエリ パフォーマンスを提供するテーブルを選択します。

結合条件を持つ論理積の最適化

結合条件とほかの述部の混成である論理積は、次の条件をすべて満たす場合、最適化に使用されます。

論理積を使用して最適化されるテーブルは、結合条件内で参照されるほかのテーブルの後で処理されます。

たとえば、テーブル t1 に最初の 3 つのセグメントとして列 c1、c2、c3 をこの順序で持つインデックスがあるとします。次の論理積は最適化に使用されます。

t1.c1 = t2.c1 AND t1.c2 = t2.c2 AND t1.c3 = t2.c3 
t1.c1 = t2.c1 AND t1.c2 > t2.c2 
t1.c1 = t2.c1 AND t1.c2 = 1 
t1.c1 = 1 AND t1.c2 = t2.c2 

結合条件を持つ変形論理積標準形の最適化

結合条件を含む変形論理積標準形(変形 CNF)は、次の条件をすべて満たす場合、最適化に使用されます。

たとえば、テーブル t1 に最初の 3 つのセグメントとして列 c1、c2、c3 をこの順序で持つインデックスがあるとします。変形 CNF の次の式は最適化に使用されます。

(t1.c1 = t2.c1) AND (t1.c2 = t2.c2 OR  
(t1.c2 > 2 AND t1.c2 < 5)) 
 
(t1.c1 = 1) AND (t1.c2 = t2.c2) AND  
(t1.c3 > 2 AND t1.c3 < 5) 

変形 CNF 最適化で結合条件の開いた範囲を閉じる

このタイプの最適化は、閉じられる範囲が結合条件であることを除けば、まさに変形 CNF 最適化で開いた範囲を閉じるとよく似ています。

たとえば、テーブル t1 に最初の 2 つのセグメントとして列 c1、c2 をこの順序で持つインデックスがあるとします。変形 CNF の次の式は最適化に使用されます。

(t1.c1 > t2.c1) AND (t1.c1 < t2.c2 OR t1.c1 = 10) 
 
(t1.c1 = t2.c1) AND (t1.c2 > t2.c2) AND (t1.c2 < 10 OR 
t1.c2 = 100) 

複数インデックスの変形論理和の最適化

変形論理和は、次の条件にすべて合致する場合、複数のインデックスを使用して最適化に使用されます。

たとえば、最初のセグメントが列 c1であるインデックスと、最初のセグメントが列 c2 であるもう 1 つのインデックスがあるとします。次の変形論理和は最適化に使用されます。

c1 = 1 OR (c1 > 5 AND c1 < 10) OR c2 = 1 

制限の分析

プッシュダウン フィルター