2018.05.25
REMOVE AGGR SUBQUERY
目次
- 1. 基本情報
- 2. 例
基本情報
パラメータ情報
Syntax : _REMOVE_AGGR_SUBQUERY = TRUE|FALSE 設定方法 : ・Parameter File ・ALTER SYSTEM SET “_REMOVE_AGGR_SUBQUERY” = ・ALTER SESSION SET “_REMOVE_AGGR_SUBQUERY” =
バージョンとデフォルト 9iR2 : ー 10gR1 : TRUE 10gR2 : TRUE 11g : TRUE
説明
Aggregate Functionを含むSubqueryをUnnestingてMain QueryのAnalytic Functionに変換する機能を提供します。このような機能をAggregate Subquery Eliminationと呼びます。
注意
Aggregate Subquery Eliminationが動作しない場合は、次のように実行されます。テーブルT2のAggregate SubqueryをViewに変換した後、テーブルT1とHash Joinし、その結果を再度テーブルT2とHash Joinします。この過程で、テーブルT2を二度アクセスするオーバーヘッドが発生します。
select /*+ gather_plan_statistics opt_param('_remove_aggr_subquery','false') */ t1.c1, t2.c2 from t1, t2 where t1.c1 = t2.c1 and t2.c2 = (select max(c2) from t2 s where s.c1 = t1.c1) ; select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); -------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | -------------------------------------------------------------------------------------------- |* 1 | HASH JOIN | | 1 | 1000 | 1000 |00:00:00.18 | 105 | | 2 | TABLE ACCESS FULL | T2 | 1 | 1000 | 1000 |00:00:00.01 | 7 | |* 3 | HASH JOIN | | 1 | 1000 | 1000 |00:00:00.15 | 98 | | 4 | VIEW | VW_SQ_1 | 1 | 1000 | 1000 |00:00:00.02 | 7 | | 5 | HASH GROUP BY | | 1 | 1000 | 1000 |00:00:00.01 | 7 | | 6 | TABLE ACCESS FULL | T2 | 1 | 1000 | 1000 |00:00:00.01 | 7 | | 7 | INDEX FAST FULL SCAN| T1_N1 | 1 | 10000 | 10000 |00:00:00.04 | 91 | --------------------------------------------------------------------------------------------
Aggregate Subquery Eliminationが動作している場合には、次のような実行パスを示します。Subqueryがなくなり、Analytic Function(WINDOWS SORT)に変換されたことを確認することができます。これにより、テーブルT2の重複的なアクセスが消え仕事量(Buffers。Logical Reads)も改善されたことを確認することができます。
select /*+ gather_plan_statistics opt_param('_remove_aggr_subquery','true') */ t1.c1, t2.c2 from t1, t2 where t1.c1 = t2.c1 and t2.c2 = (select max(c2) from t2 s where s.c1 = t1.c1) ; select * from table(dbms_xplan.display_cursor(null, null, 'allstats last')); ---------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ---------------------------------------------------------------------------------------------- |* 1 | VIEW | VW_WIF_1 | 1 | 1000 | 1000 |00:00:00.15 | 31 | | 2 | WINDOW SORT | | 1 | 1000 | 1000 |00:00:00.14 | 31 | |* 3 | HASH JOIN | | 1 | 1000 | 1000 |00:00:00.14 | 31 | | 4 | TABLE ACCESS FULL | T2 | 1 | 1000 | 1000 |00:00:00.01 | 7 | | 5 | INDEX FAST FULL SCAN| T1_N1 | 1 | 10000 | 10000 |00:00:00.03 | 24 | ----------------------------------------------------------------------------------------------