前回に作成したテスト表にインデックスを作成して、実行計画、ベースラインがどう変化するかを確認します。

SQL> ALTER SYSTEM FLUSH SHARED_POOL;

システムが変更されました。

SQL> CONN test/password
接続されました。
SQL> CREATE INDEX spm_test_idx ON spm_test_tab(id);

索引が作成されました。

SQL> EXEC DBMS_STATS.gather_table_stats(USER,'SPM_TEST_TAB', cascade=>TRUE);

PL/SQLプロシージャが正常に完了しました。


共有プールを空にした後、インデックスの作成、統計情報の収集を行ないます。

SQL> SET AUTOTRACE TRACE
SQL> SELECT description
  2  FROM   spm_test_tab
  3  WHERE  id = 99;


実行計画
----------------------------------------------------------
Plan hash value: 1107868462

--------------------------------------------------------------------------------
--

| Id  | Operation         | Name         | Rows  | Bytes | Cost (%CPU)| Time
 |

--------------------------------------------------------------------------------
--

|   0 | SELECT STATEMENT  |              |     1 |    25 |    14   (0)| 00:00:01
 |

|*  1 |  TABLE ACCESS FULL| SPM_TEST_TAB |     1 |    25 |    14   (0)| 00:00:01
 |

--------------------------------------------------------------------------------
--


Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("ID"=99)

Note
-----
   - SQL plan baseline "SQL_PLAN_7qxjk7bch8h5tb65c37c8" used for this statement


統計
----------------------------------------------------------
        755  recursive calls
         58  db block gets
        876  consistent gets
          1  physical reads
      10292  redo size
        584  bytes sent via SQL*Net to client
        551  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
         49  sorts (memory)
          0  sorts (disk)
          1  rows processed


インデックスを作成した列を検索条件として利用する、SELECTを実行し、実行計画を確認します。
「TABLE ACCESS FULL」よりテーブルスキャンが行なわれていることがわかります。
さらに「SQL plan baseline ~ used」よりベースラインの実行計画が利用されていることがわかります。

SQL> CONN / as sysdba
接続されました。

SQL> SELECT sql_handle, plan_name, enabled, accepted
  2  FROM dba_sql_plan_baselines
  3  WHERE sql_handle = 'SQL_7b76323ad90440b9';

SQL_HANDLE           PLAN_NAME                      ENA ACC
-------------------- ------------------------------ --- ---
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5t17ba446f YES NO
SQL_7b76323ad90440b9 SQL_PLAN_7qxjk7bch8h5tb65c37c8 YES YES


ベースラインの確認をしてみましょう。
「SQL_PLAN_7qxjk7bch8h5t17ba446f」が追加されました。
これがインデックススキャンの実行計画になります。
ACCEPTED列がNOなので、承認されていない実行計画になり、まだ利用することが出来ません。
そのために、テーブルスキャンになったのです。

次回はその実行計画を承認してみましょう。