プラン最適化ガイドライン

プラン最適化ガイドラインは、ステートメントのアクセス方式、結合方式、結合順序、およびその他の実行プランの詳細が決定されるコスト・ベースの最適化のフェーズで適用されます。

プラン最適化ガイドラインでは、実行プランのすべての面を指定する必要はありません。実行プランのうち、指定されなかった面については、コスト・ベースの方法でオプティマイザーによって決定されます。

プラン最適化ガイドラインには、2 つのカテゴリーがあります。
  • accessRequest – アクセス要求は、ステートメントの表参照を満たすアクセス方式を指定します。
  • joinRequest – 結合要求では、結合操作を実行する方式および順序を指定します。結合要求は、アクセス要求またはその他の結合要求で構成されます。

アクセス要求の最適化ガイドラインは、オプティマイザーのデータ・アクセス方式 (表スキャン、索引スキャン、リスト・プリフェッチなど) に対応します。 結合要求の最適化ガイドラインは、オプティマイザーの結合方式 (ネスト・ループ結合、ハッシュ結合、マージ結合など) に対応します。各アクセス要求および結合要求は、ステートメント最適化ガイドライン・スキーマの対応するアクセス要求エレメントおよび結合要求エレメントによって表されます。

以下の例は、IXSCAN アクセス要求エレメントによって表されているように、索引スキャン・アクセス要求を示しています。この特定の要求では、ステートメントのメインの副選択内での SUPPLIERS 表へのアクセスに、オプティマイザーが I_SUPPKEY 索引を使用するよう指定します。オプションの INDEX 属性は、必要な索引を識別します。TABLE 属性は、アクセス要求が適用される表参照を識別します。TABLE 属性は、直接的な名前 (この例では、相関名 S) を使用して、ターゲット表参照を識別する必要があります。
SQL statement:

   select s.s_name, s.s_address, s.s_phone, s.s_comment
     from "Samp".parts, "Samp".suppliers s, "Samp".partsupp ps
     where p_partkey = ps.ps_partkey and
       s.s_suppkey = ps.ps_suppkey and
       p_size = 39 and
       p_type = 'BRASS' and
       s.s_nation in ('MOROCCO', 'SPAIN') and
       ps.ps_supplycost = (select min(ps1.ps_supplycost)
                             from "Samp".partsupp ps1, "Samp".suppliers s1
                             where "Samp".parts.p_partkey = ps1.ps_partkey and
                             s1.s_suppkey = ps1.ps_suppkey and
                             s1.s_nation = s.s_nation)
     order by s.s_name

Optimization guideline:

   <OPTGUIDELINES>
     <IXSCAN TABLE='S' INDEX='I_SUPPKEY'/>
   </OPTGUIDELINES>
以下の索引スキャン・アクセス要求エレメントは、オプティマイザーがステートメントのメインの副選択で PARTS 表に対して索引アクセスを使用するように指定します。INDEX 属性がないため、オプティマイザーはコスト・ベースの方法で索引を選択します。関連する相関名がないため、TABLE 属性は修飾表名を使用して、ターゲット表参照を参照します。
   <OPTGUIDELINES>
     <IXSCAN TABLE='"Samp".PARTS'/>
   </OPTGUIDELINES>
以下のリスト・プリフェッチ・アクセス要求は、LPREFETCH アクセス要求エレメントによって表されています。この特定の要求では、ステートメントのネストされた副選択内での SUPPLIERS 表へのアクセスに、オプティマイザーが I_SNATION 索引を使用するよう指定します。TABLE 属性は、相関名 S1 を使用します。これは、ネストされた副選択内で SUPPLIERS 表参照を識別する直接的な名前だからです。
   <OPTGUIDELINES>
     <LPREFETCH TABLE='S1' INDEX='I_SNATION'/>
   </OPTGUIDELINES>
以下の索引スキャン・アクセス要求エレメントでは、メインの副選択での SUPPLIERS 表へのアクセスに、オプティマイザーが I_SNAME 索引を使用するよう指定します。FIRST 属性は、この表が、対応する FROM 節用に選択された結合順序内で、最初にアクセスされる表になるように指定します。FIRST 属性は任意のアクセス要求または結合要求に追加できますが、同じ FROM 節の表を参照する FIRST 属性を持つアクセス要求または結合要求は最大 1 つしかありません。
SQL statement:

   select s.s_name, s.s_address, s.s_phone, s.s_comment
     from "Samp".parts, "Samp".suppliers s, "Samp".partsupp ps
     where p_partkey = ps.ps_partkey
       s.s_suppkey = ps.ps_suppkey and
       p_size = 39 and
       p_type = 'BRASS' and
       s.s_nation in ('MOROCCO', 'SPAIN') and
       ps.ps_supplycost = (select min(ps1.ps_supplycost)
                             from "Samp".partsupp ps1, "Samp".suppliers s1
                             where "Samp".parts.p_partkey = ps1.ps_partkey and
                               s1.s_suppkey = ps1.ps_suppkey and
                               s1.s_nation = s.s_nation)
     order by s.s_name
     optimize for 1 row

Optimization guidelines:

   <OPTGUIDELINES>
     <IXSCAN TABLE='S' INDEX='I_SNAME' FIRST='TRUE'/>
   </OPTGUIDELINES>
以下の例は、複数のアクセス要求を単一のステートメント最適化ガイドラインに受け渡す方法について示しています。TBSCAN アクセス要求エレメントは、表スキャン・アクセス要求を表します。この特定の要求は、ネストされた副選択内の SUPPLIERS 表が完全表スキャンを使用してアクセスされるように指定します。LPREFETCH アクセス要求エレメントは、オプティマイザーが、メインの副選択での SUPPLIERS 表へのリスト・プリフェッチ索引アクセス中に、I_SUPPKEY 索引を使用するように指定します。
   <OPTGUIDELINES>
     <TBSCAN TABLE='S1'/>
     <LPREFETCH TABLE='S' INDEX='I_SUPPKEY'/>
   </OPTGUIDELINES>
以下の例は、NLJOIN 結合要求エレメントによって表されているように、ネスト・ループ結合要求を示しています。一般的に、結合要求エレメントには、2 つの子エレメントが含まれています。最初の子エレメントは、結合操作への必要な外部入力を表し、2 番目の子エレメントは、結合操作への必要な内部入力を表します。子エレメントは、アクセス要求、他の結合要求、またはアクセス要求と結合要求の組み合わせとすることができます。この例で、最初の IXSCAN アクセス要求エレメントは、メインの副選択内の PARTS 表が結合操作の外部表になるように指定します。また、PARTS 表のアクセスが索引スキャンを使用して実行されることも指定します。2 番目の IXSCAN アクセス要求エレメントは、メインの副選択内の PARTSUPP 表が結合操作の内部表になるように指定します。また、表が索引スキャンを使用してアクセスされることも指定します。
   <OPTGUIDELINES>
     <NLJOIN>
       <IXSCAN TABLE='"Samp".Parts'/>
       <IXSCAN TABLE="PS"/>
     </NLJOIN>
   </OPTGUIDELINES>
以下の例は、HSJOIN 結合要求エレメントによって表されているように、ハッシュ結合要求を示しています。ACCESS アクセス要求エレメントは、ネストされた副選択内の SUPPLIERS 表が結合操作の外部表になるように指定します。このアクセス要求エレメントは、結合順序を指定することが第一の目的である場合に役立ちます。IXSCAN アクセス要求エレメントは、ネストされた副選択内の PARTSUPP 表が結合操作の内部表になること、およびオプティマイザーがその表へのアクセスに索引スキャンを選択することを指定します。
   <OPTGUIDELINES>
     <HSJOIN>
       <ACCESS TABLE='S1'/>
       <IXSCAN TABLE='PS1'/>
     </HSJOIN>
   </OPTGUIDELINES>
以下の例は、結合要求のネスティングによって、より大きな結合要求を構成する方法を示しています。例には、MSJOIN 結合要求エレメントによって表されているように、マージ結合要求が含まれます。結合操作の外部入力は、NLJOIN 結合要求エレメントによって表されているように、メインの副選択の PARTS 表と PARTSUPP 表の結合の結果です。結合要求エレメントの内部入力は、IXSCAN アクセス要求エレメントによって表されているように、メインの副選択内の SUPPLIERS 表です。
   <OPTGUIDELINES>
     <MSJOIN>
       <NLJOIN>
         <IXSCAN TABLE='"Samp".Parts'/>
         <IXSCAN TABLE="PS"/>
       </NLJOIN>
       <IXSCAN TABLE='S'/>
     </MSJOIN>
   </OPTGUIDELINES>

結合要求が有効になる場合、直接的または間接的にその内部にネストされたすべてのアクセス要求エレメントは、最適化されるステートメントの同じ FROM 節の表を参照する必要があります。

MQT マッチングの最適化ガイドライン

ユーザーはオプティマイザーの決定をオーバーライドし、MQTENFORCE エレメントによって特定のマテリアライズ照会表 (MQT) を強制的に選択させることができます。MQTENFORCE エレメントはグローバルおよびステートメントのどちらのプロファイル・レベルにおいても指定でき、以下のいずれかの属性を指定して使用できます。
NAME
選択する MQT の名前の一部、または完全修飾名を指定します。
TYPE
タイプごとに MQT のグループを指定します。可能な値は以下のとおりです。
  • NORMAL: すべての非複製 MQT
  • REPLICATED: すべての複製 MQT
  • ALL: すべての MQT
以下は、すべての複製 MQT と SAMP.PARTSMQT を強制的に選択するガイドライン例です。
	<OPTGUIDELINES>
		<MQTENFORCE NAME='SAMP.PARTSMQT'/>
		<MQTENFORCE TYPE='REPLICATED'/>
	</OPTGUIDELINES>
注: 一度に複数の属性を指定すると、最初の属性のみが使用されます。したがって、次の例の場合、
<MQTENFORCE NAME='SAMP.PARTSMQT' TYPE='REPLICATED'/>
PARTSMQT MQT だけが強制的に選択されます。