複数の列に対する検索条件を指定したクエリーを頻繁に実行する場合は、それらの列に関する統計を結合して収集する必要があります。この方法で統計を収集することにより、最適化ルーチンは、これらの両方の列を指定するクエリーに該当する行の数をより正確に見積もることができるようになります。グローバル一時テーブルの複数列統計は収集できません。
column_1およびcolumn_2用に派生される統計は、結合して収集される場合は、同じ列に関する統計を別々に収集することによって派生される統計とは異なるという点に注意する必要があります。例えば、FirstNameとLastNameという名前の2つの列があるとします。具体的には、FirstNameに関して収集される統計では例えばJohnという名前を持つ人の数が見積もられ、LastNameに関して収集される統計ではSmithという名字を持つ人の数が見積もられます。
これらの統計では、John Smithという名前の人の数を正確に見積もることはできません。したがって、この2つの列に関する統計を結合して収集する必要があります。この例は、個々の列で統計を収集することと、それらの同じ列を結合して統計を収集することの違いを示すためのものに過ぎません。
以下の表は、複数列に関する統計を収集する方法を判別するための一般的な指針を示しています。
インデックスの付けられていない列のセットを指定する頻度 | 統計データを収集する対象 |
---|---|
等価条件またはWHERE句結合条件として一緒に指定する頻度が高い | 列セットを結合して収集 |
等価条件またはWHERE句結合条件として一緒に指定する頻度が低い | 個々の列を別々に収集 |
インデックスが同じ列セットで定義されている場合は、Teradata Databaseは複数列統計をインデックス統計と同様に処理します。
例えば、テーブルx1の(y1, t1)でインデックスを定義した場合、以下の2つのリクエストは、同じ統計を収集してDBC.StatsTblに格納することになります。
COLLECT STATISTICS ON t1 COLUMN (x1,y1); COLLECT STATISTICS ON t1 INDEX (x1,y1);
一般ルールとして、列に多数のnullが含まれており、その列が述部で頻繁に指定されていない場合は、複数列の統計を収集する場合にこの列を含めないようにします。
例えば、列1、列2、および列3について複数行の統計を収集し、それぞれの値が次のようになっているとします。ここで、疑問符(?)のマークはnullを表わします。
列1 | 列2 | 列3 |
1 | 2 | 3 |
? | 2 | 3 |
1 | ? | 3 |
1 | 2 | ? |
? | ? | ? |
1 | 2 | ? |
1 | 2 | ? |
1 | 2 | ? |
1 | 2 | ? |
1 | 2 | ? |
列3が多数の述部で指定されている場合を除いては、列3を含む複数列の統計を収集することは望ましくありません。