索引の有る無しによるパフォーマンス、実行計画の違いを確認してみます。
SQL> create table TBL1 (col1 number, col2 varchar2(100)) segment creation immediate tablespace TBS_BIG;
表が作成されました。
SQL> alter table TBL1 add constraint PK_TBL1_COL1 primary key(COL1);
表が変更されました。
TBL1は主キー索引を持ちます。
SQL> create table TBL2 as select * from TBL1;
表が作成されました。
TBL2はTBL1と同じデータを持ちます。
ただし、索引は持ちません。
[oracle@db01 ~]$ sqlplus / as sysdba
SQL> show parameter filesystemio
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
filesystemio_options string none
SQL> alter system set FILESYSTEMIO_OPTIONS='SETALL' scope=spfile;
システムが変更されました。
SQL> shutdown immediate;
SQL> startup
SQL> show parameter filesystemio
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
filesystemio_options string SETALL
パフォーマンスを比較する前に、OSのファイルシステムキャッシュを利用しない設定を行ないます。
これでダイレクトにディスクへの書き込みを行ないます。
[oracle@db01 ~]$ sqlplus / as sysdba
SQL> alter system FLUSH BUFFER_CACHE;
システムが変更されました。
また、各テストを実施する前に、DBのバッファキャッシュを空にします。
各テストの実施条件を一緒にするためです。
SQL> set timing on
SQL> select * from TBL1 where col1 = 10000;
COL1
----------
COL2
--------------------------------------------------------------------------------
10000
10000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
経過: 00:00:00.15
まずは索引の有る表でSELECTを実行します。
実行時間0.15秒
[oracle@db01 ~]$ sqlplus / as sysdba
SQL> alter system FLUSH BUFFER_CACHE;
システムが変更されました。
もう一個の表を確認する前にバッファキャッシュをクリアします。
SQL> set timing on
SQL> select * from TBL2 where col1 = 10000;
COL1
----------
COL2
--------------------------------------------------------------------------------
10000
10000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
経過: 00:00:02.91
索引の無い表でSELECTを実行します。
時間は2.91秒
明らかにパフォーマンスが違います。
次はそれぞれの実行計画を確認してみます。
SQL> create table TBL1 (col1 number, col2 varchar2(100)) segment creation immediate tablespace TBS_BIG;
表が作成されました。
SQL> alter table TBL1 add constraint PK_TBL1_COL1 primary key(COL1);
表が変更されました。
TBL1は主キー索引を持ちます。
SQL> create table TBL2 as select * from TBL1;
表が作成されました。
TBL2はTBL1と同じデータを持ちます。
ただし、索引は持ちません。
[oracle@db01 ~]$ sqlplus / as sysdba
SQL> show parameter filesystemio
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
filesystemio_options string none
SQL> alter system set FILESYSTEMIO_OPTIONS='SETALL' scope=spfile;
システムが変更されました。
SQL> shutdown immediate;
SQL> startup
SQL> show parameter filesystemio
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
filesystemio_options string SETALL
パフォーマンスを比較する前に、OSのファイルシステムキャッシュを利用しない設定を行ないます。
これでダイレクトにディスクへの書き込みを行ないます。
[oracle@db01 ~]$ sqlplus / as sysdba
SQL> alter system FLUSH BUFFER_CACHE;
システムが変更されました。
また、各テストを実施する前に、DBのバッファキャッシュを空にします。
各テストの実施条件を一緒にするためです。
SQL> set timing on
SQL> select * from TBL1 where col1 = 10000;
COL1
----------
COL2
--------------------------------------------------------------------------------
10000
10000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
経過: 00:00:00.15
まずは索引の有る表でSELECTを実行します。
実行時間0.15秒
[oracle@db01 ~]$ sqlplus / as sysdba
SQL> alter system FLUSH BUFFER_CACHE;
システムが変更されました。
もう一個の表を確認する前にバッファキャッシュをクリアします。
SQL> set timing on
SQL> select * from TBL2 where col1 = 10000;
COL1
----------
COL2
--------------------------------------------------------------------------------
10000
10000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
経過: 00:00:02.91
索引の無い表でSELECTを実行します。
時間は2.91秒
明らかにパフォーマンスが違います。
次はそれぞれの実行計画を確認してみます。

コメント