サンプル表の作成
それでは統計情報がどのように実行計画に影響を与えるか、確認していきます。まずリスト5のサンプル表と索引を作成します。以降、オプティマイザのモードは「CHOOSE」であるとします。
|
|
リスト5 サンプル表と索引の作成 |
統計情報の有無による実行計画の違い
まずは統計情報を取得せずに、AUTOTRACEを実行し実行計画を確認してみます。
SQL> SET AUTOTRACE ON; |
リスト6 AUTOTRACEを実行し実行計画を確認 |
「INDEX (RANGE SCAN) OF 'IDX_TEST_TABLE' (NON-UNIQUE)」と表示され、インデックス・スキャンが行われたことが分かります。オプティマイザ・モードが「CHOOSE」であるため、統計情報の存在しないテーブルはルールベースを採用した検索となります。
次に、test_tableとidx_test_tableにANALYZEコマンドで統計情報を作成し、同じSQLを発行します。
SQL> ANALYZE TABLE test_table COMPUTE STATISTICS; |
リスト7 ANALYZEコマンドを実行し、AUTOTRACEで実行計画を確認 |
「TABLE ACCESS (FULL) OF 'TEST_TABLE' (Cost=2 Card=100 Bytes=1300)」と表示されました。オプティマイザ・モードが「CHOOSE」で統計情報が存在するため、コストベースを採用した検索となり、ここではフル・スキャンが行われました。
実行計画の検証とオプティマイザの挙動
索引が存在するのに、なぜインデックス・スキャンが採用されないのでしょうか。コストベースでは、テーブル全体の構成を統計情報から取得し、NO列の10から10000までのテーブルデータを取得する際に、索引を使用して検索するよりも、表データを1行目から順に見ていき、10より大きいデータを採用する方がコスト的に有効であると判断したからです。
以下のSQL文では1000行のデータから1行を取得するので索引を使用した方が有効と判断され、「INDEX (RANGE SCAN) OF 'IDX_TEST_TABLE'(NON-UNIQUE) (Cost=1 Card=1)」の表示からインデックス・スキャンが採用されたことが分かります。
SQL> SELECT * FROM test_table WHERE no =10000; |
リスト8 1件のデータを検索 |
(次ページに続く)
Copyright © ITmedia, Inc. All Rights Reserved.