前回に作成したテスト表にインデックスを作成して、実行計画、ベースラインがどう変化するかを確認します。
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なので、承認されていない実行計画になり、まだ利用することが出来ません。
そのために、テーブルスキャンになったのです。
次回はその実行計画を承認してみましょう。
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なので、承認されていない実行計画になり、まだ利用することが出来ません。
そのために、テーブルスキャンになったのです。
次回はその実行計画を承認してみましょう。
コメント