2019.01.16
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パラメータ