ハッシュ・アルゴリズムによるグルーピング処理
Oracle9iまでは、Group by句を指定すると、内部的にソート処理がなされていました。そのため、ソートされた結果が戻ることを想定して、使用されていたケースもあるようです。
SQL> SELECT SUM(SAL), DEPTNO FROM EMP GROUP BY DEPTNO; SUM(SAL) DEPTNO ---------- ---------- 8750 10 10875 20 9400 30
10g以降のリリースでは、『HASH GROUP BY集計』というハッシュ・アルゴリズムを使用したグルーピング処理が採用されるようになりました。この結果、無駄なソート処理を行うことなく効率的に集計処理を実施することができます。
SQL> SELECT SUM(SAL), DEPTNO FROM EMP GROUP BY DEPTNO; SUM(SAL) DEPTNO ---------- ---------- 9400 30 10875 20 8750 10
レポート処理などで、ソートされていることを想定してGROUP BY句を使用していた場合は、10gへの移行後に表示順が変わってしまうので要注意です。集計結果をソートしたい場合は、ORDER BY句を明示的に指定する必要があります。
SQL> SELECT SUM(SAL), DEPTNO FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO; SUM(SAL) DEPTNO ---------- ---------- 8750 10 10875 20 9400 30
オプティマイザの実行計画も確認してみましょう。
まずは、実行計画を格納するための表『PLAN_TABLE』を作成する必要があります。utlxplan.sqlは、PLAN_TABLEを作成するためのスクリプトです。
SQL> @%ORACLE_HOME%\RDBMS\admin\utlxplan.sql 表が作成されました。
次に、『EXPLAIN PLAN』コマンドを実行して実行計画をPLAN_TABLEに格納します。FORの後に実行計画を取得したいSQL文を指定します。
SQL> EXPLAIN PLAN FOR SELECT SUM(SAL), DEPTNO FROM EMP GROUP BY DEPTNO; 解析されました。
最後に、取得した実行計画を表示します。utlxpls.sqlは、PLAN_TABLEに格納されている実行計画を見やすい形式に整形して表示してくれるスクリプトです。
SQL> @%ORACLE_HOME%\RDBMS\admin\utlxpls.sql PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 4067220884 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 3 | 21 | 4 (25)| 00:00:01 | | 1 | HASH GROUP BY | | 3 | 21 | 4 (25)| 00:00:01 | | 2 | TABLE ACCESS FULL| EMP | 14 | 98 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------
実行計画からハッシュ・アルゴリズムを使用してグルーピング処理を行っていることがわかります。