データベースは、正規化したテーブルを作成し、チューニングをすることで非常に性能の差が出てきます。 チューニングをするための知識は非常に多いですが、ここではチューニングする時に必要なコマンドなどを 説明したいと思います。
チューニングするためには、いくつかユーティリティが用意されています。
実行計画を取るためには、あらかじめその値を保持しておくためのテーブルが必要です。 Oracleをインストールしたディレクトリ内にutlxplan.sqlがあるのでこれを実行することで テーブルを作成します。
SQL> @$ORACLE_HOME/rdbms/admin/utlxplan.sql
Table created.
SQL> desc plan_table;
Name Null? Type
----------------------------
STATEMENT_ID VARCHAR2(30)
TIMESTAMP DATE
REMARKS VARCHAR2(80)
OPERATION VARCHAR2(30)
OPTIONS VARCHAR2(255)
OBJECT_NODE VARCHAR2(128)
OBJECT_OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(30)
OBJECT_INSTANCE NUMBER(38)
OBJECT_TYPE VARCHAR2(30)
OPTIMIZER VARCHAR2(255)
SEARCH_COLUMNS NUMBER
ID NUMBER(38)
PARENT_ID NUMBER(38)
POSITION NUMBER(38)
COST NUMBER(38)
CARDINALITY NUMBER(38)
BYTES NUMBER(38)
OTHER_TAG VARCHAR2(255)
PARTITION_START VARCHAR2(255)
PARTITION_STOP VARCHAR2(255)
PARTITION_ID NUMBER(38)
OTHER LONG
DISTRIBUTION VARCHAR2(30)
CPU_COST NUMBER(38)
IO_COST NUMBER(38)
TEMP_SPACE NUMBER(38)
ACCESS_PREDICATES VARCHAR2(4000)
FILTER_PREDICATES VARCHAR2(4000)
実行計画を表示するためのsqlもutlxpls.sqlとして用意されているのでこれを実行すればよいだけです。
SQL> @$ORACLE_HOME/rdbms/admin/utlxpls.sql
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | TABLE ACCESS FULL| DUAL | | | |
--------------------------------------------------------------------
Note: rule based optimization
9 rows selected.
SQL> create table hoge_table (hoge_id number, hoge_name varchar2(8));
Table created.
SQL> alter table hoge_table add constraint pk_hoge primary key(hoge_id);
Table altered.
SQL> insert into hoge_table values (1,'aaa');
1 row created.
SQL> insert into hoge_table values (2,'bbb');
1 row created.
SQL> commit;
sql文にexplain plan forをつける事で、実行計画を取ることができます。実際に標準出力に表示されるのではなく、先ほど作った 実行計画用のテーブルに格納されます。ここでは、索引を使った検索をテストしてみます。(INDEX UNIQUE SCANという)
SQL> explain plan for select * from hoge_table where hoge_id = '1';
Explained.
SQL> @$ORACLE_HOME/rdbms/admin/utlxpls
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | TABLE ACCESS BY INDEX ROWID| HOGE_TABLE | | | |
|* 2 | INDEX UNIQUE SCAN | SYS_C009089 | | | |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("HOGE_TABLE"."HOGE_ID"=1)
Note: rule based optimization
15 rows selected.
SQL> explain plan for select * from hoge_table;
Explained.
SQL> @$ORACLE_HOME/rdbms/admin/utlxpls
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | TABLE ACCESS FULL | HOGE_TABLE | | | |
--------------------------------------------------------------------
Note: rule based optimization
9 rows selected.
sql*plusのautotraceコマンドでも実行計画や統計情報を取得することが出来ます。 autotraceはPLUSTRACEロールを作成し、SYSDBAユーザで実行することが可能です。
SQL> connect okita/okita as sysdba
Connected.
SQL> @$ORACLE_HOME/sqlplus/admin/plustrce.sql
SQL>
SQL> drop role plustrace;
Role dropped.
SQL> create role plustrace;
Role created.
SQL>
SQL> grant select on v_$sesstat to plustrace;
Grant succeeded.
SQL> grant select on v_$statname to plustrace;
Grant succeeded.
SQL> grant select on v_$mystat to plustrace;
Grant succeeded.
SQL> grant plustrace to dba with admin option;
Grant succeeded.
SQL>
SQL> set echo off
SQL> grant plustrace to okita;
Grant succeeded.
SQL> set autotrace on
SQL> select * from dual;
D
-
X
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'DUAL'
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
375 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> set autotrace off;
SQL> select * from dual;
D
-
X
オプティマイザには、Rule Base Optimizer(RBO)とCost Base Optimizer(CBO)があります。ヒント文をつかって文レベルのオプティマイザ設定も可能です。 また以下のようなコマンドで設定する方法もあります。
alter session set optimizer_mode={ CHOOSE | RULE | FIRST_ROWS | FIRST_ROWS_n | ALL_ROWS }
analyze table TABLE_NAME compute statistics
analyze table TABLE_NAME estimate statistics
analyze index TABLE_NAME compute statistics
analyze index TABLE_NAME estimate statistics
analyze table TABLE_NAME delete statistices
DBMS_STATSパッケージを使ってCBOの統計情報を表示できます。
exec dbms_stats.gether_schema_stats ( ownname => 'aaa' estimate_percent => DBMS_STSTS.AUTO_SAMPLE_SIZE);
DBA_TABLES,DBA_TAB_COL_STATISTICS,DBA_INDEXESのテーブルで統計情報を確認することが出来ます。