OPTIMIZER COST BASED TRANSFORMATION

目次

基本情報

 

パラメータ情報

 

Syntax   : _OPTIMIZER_COST_BASED_TRANSFORMATION = ON|LINEAR|OFF
設定方法  : ・Parameter File
      ・ALTER SYSTEM SET “_OPTIMIZER_COST_BASED_TRANSFORMATION” = ON
      ・ALTER SESSION SET “_OPTIMIZER_COST_BASED_TRANSFORMATION” = ON

 

バージョンとデフォルト
9iR2 : -
10gR1: ON
10gR2: ON	
11g: ON	

 

説明

 

Subquery UnnestingやView MergingなどのQuery TransformationをCost basedで行うかどうかを指定します。Cost Based Query Transformationは10gで導入された概念で、既定値は常にTrueです。Oracle9iまではOracleは、可能な、常にQuery Transformationを試みます。しかし、10gからコスト(Cost)を考慮して、Subquery UnnestingとView Mergingが費用を減らすのに役立つ場合にのみ実行します。

注意

実行計画以上のCost Based Transformation

 

9iのバージョンで正常にSubquery UnnestingやView Mergingが行われるクエリが10gでは、変換が発生しないことがあります。統計情報が正確であれば、Oracleのほとんどの場合、最適の判断をするが、時折、特定のクエリの場合には、変換が行われないことにより、非効率的な実行計画に変わることがあります。このような場合には、_OPTIMIZER_COST_BASED_TRANSFORMATIONパラメータの値をOFFに変更したり、OPT_PARAMヒントを利用して、そのパラメータをStatementレベルで変更する必要があります。

alter session set_optimizer_cost_based_transformation= off;

 - あるいは

select/*+ opt_param('_ optimizer_cost_based_transformation'、 'off')*/...

10053 TraceとCost Based Transformation

 

10gR2から10053 TraceにQuery Transformation過程が詳細に記録されます。したがってCost Base Transformation過程も10053 Traceを利用してTroubleshootingが可能となりました。10053 Trace FileでのQuery Transformationデバッグの例は、以下の通りです。

SELECT /*+ */ "T3"."C1" "C1","T4"."C2" "C2",COUNT(*) "CNT" FROM "UKJA"."T3" "T3",
"UKJA"."T4" "T4" WHERE "T3"."C1"="T4"."C1" GROUP BY "T3"."C1","T4"."C2"
Query block (04C7F7C8) unchanged
CVM:     CVM bypassed: Outer QB referencing ROWNUM

SELECT /*+ */ "T2"."C1" "C1","X"."C2" "C2","X"."CNT" "CNT",ROWNUM "R" FROM "UKJA"."T2" "T2", 
(SELECT /*+ */ "T3"."C1" "C1","T4"."C2" "C2",COUNT(*) "CNT" FROM "UKJA"."T3" "T3",
"UKJA"."T4" "T4" WHERE "T3"."C1"="T4"."C1" GROUP BY "T3"."C1","T4"."C2") "X" 
WHERE "T2"."C1"="X"."C1"
Query block (04C7FE60) unchanged
CVM:     CVM bypassed: ROWNUM column

PM: Considering predicate move-around in SEL$1 (#1).
PM:   Checking validity of predicate move-around in SEL$1 (#1).
PM:     PM bypassed: Reference to ROWNUM.
PM:   Passed validity checks.

上記の例では、ROWNUMによってCVM(Complex View Merging)とPM(Predicate Move-Around)が行われ、このていないことを知ることができます。

関連情報

 

1.MERGEヒント
2.NO_UNNESTヒント
3.NO_MERGEヒント
4.NO_QUERY_TRANSFORMATIONヒント
5.UNNESTヒント
6._OPTIMIZER_PUSH_PRED_COST_BASEDパラメータ

外部参照

 

  

 
 
性能調査が加速する日本エクセムのMaxGauge