静的パーティション排除の効果を上げてクエリーを最適化するために実行するべきことと、実行すべきでないことについて、以下の指針を参考にしてください。
いつものように、使用する技法で希望する結果が得られることを確認する必要があります。
- パーティション化されたテーブルのパーティション列に対して式または関数(日付ベースの組み込み関数を除く)を指定することは避けてください。
次の例は、問題のあるテーブル定義とクエリー、およびパーティション向上のために書き換えた定義とクエリーを示しています。
最適でない元のテーブル定義およびクエリー 書き換えたテーブル定義およびクエリー CREATE TABLE ... PARTITION BY x; SELECT ... WHERE x+1 IN (2,3);
CREATE TABLE ... PARTITION BY RANGE_N(x BETWEEN 1 AND 65533 EACH 1);
このパーティション指定のように65,533と記述するのではなく、この2バイト パーティションで想定される最大パーティション数を指定できます。
SELECT ... WHERE x IN (1,2);
CREATE TABLE ... PARTITION BY x+1; SELECT ... WHERE x IN (1,2);
CREATE TABLE ... PARTITION BY RANGE_N(x BETWEEN 0 AND 65532 EACH 1);
このパーティション指定のように65,532と記述するのではなく、この2バイト パーティションで想定される最大パーティション数を指定できます。
SELECT ... WHERE x IN (1,2);
- クエリーの述部は、パーティション化されたテーブルのパーティション列に対して定数条件で式を定義すると、最も効率的になります。次の述部は、定数条件との単純な等価比較として好ましい例です。ここでdはテーブルのパーティション列です。
- d = 10
- d >= 10 AND d =< 12
- d BETWEEN 10 AND 12
- d = 10+1
- d IN (20, 22, 24)
- d = 20 OR d=21
テーブルのパーティション式がRANGE_N関数を使用して定義されていない場合、クエリー述部は、等価条件として指定されるときに最も効果的になります。
- クエリー述部は、述部が単一パーティションまたはDATEやCURRENT_DATE組み込み関数を指定する場合、USING変数で等価条件を指定するときに効果的です。たとえば、パーティション式が日付ベースで、パーティション列に対して記述された条件がCURRENT_DATE組み込み関数を使用して定義されている場合、最適化ルーチンは静的行パーティション排除を行ないます。
最適化ルーチンもUSINGリクエスト修飾子の値の代用となって、クエリー計画をさらに最適化することができます。<Teradata Vantage™- SQLリクエストおよびトランザクション処理、B035-1142>の「リクエストの構文解析」を参照してください。
同一パーティション列に指定された複数のOR結合の等価条件では、行パーティション排除が許可されません。
USING変数で等価条件を指定するときにこの状況に該当する場合、次の代替方法のいずれかを検討してください。- 次善策としてUNION演算子を使用する。
- 述部条件でUSING変数の定数を置き換える。
パラメータ化されたクエリーを使用する代わりに、次の代替方法の任意のを検討します。- パラメータ化されていないクエリーを使用する。
- クエリーの発行前に、プリプロセッサを使用してパラメータ化変数を置き換える。