Full Scanを速くしちゃう その7

投稿日: 2005年7月20日

<Full Scanを速くしちゃう その7>
ペンネーム:グリーンペペ

Full Scanを速くするテクニックとしてMaterialized View(以後MView)を取り
上げる。MViewはDBLink先リモートDBの複製として使用する場合があるが、ロ
ーカルDB上の表などからによる集計や結合、条件といった出力結果を格納する
ことができる。早速使ってみよう。

◆環境
HP-UX hp11i B.11.11
Oracle9i Enterprise Edition Release 9.2.0.5.0 – 64bit Production

◆検証
–MViewを作成する

SQL> create materialized view tpc2.mv_stock as select count(*) from tpc2.stock;

ORA-01031: insufficient privileges

MViewを作成するにはcreate any materialized view権限が必要だ。

–create any materialized view権限をtpc2ユーザに付与し、MViewを作成する。

SQL> conn system/********
SQL> grant create any materialized view to tpc2;
SQL> conn tpc2/********
SQL> create materialized view tpc2.mv_stock as select count(*) from tpc2.stock;

Materialized view created.

MViewが作成された。

–性能比較 Full Scan VS MView

SQL> select count(*) from tpc2.stock;
  COUNT(*)
----------
    500000

Elapsed: 00:00:12.20

Statistics
----------------------------------------------------------
::略::
      45460  consistent gets
      44992  physical reads
::略::
SQL> select * from tpc2.mv_stock;

  COUNT(*)
----------
    500000

Elapsed: 00:00:00.00

Statistics
----------------------------------------------------------
::略::
          3  consistent gets
          0  physical reads
::略::

当然ながら、MViewに対してアクセスした方がアクセスする行数が少ないので
I/Oもレスポンス時間も優れている。
しかしながら、MViewにアクセスするようにSQL文を書き換える必要がある。ま
た今回の検証のようにcountを取得するのにMViewへアクセスする際にはcount
関数は使用しておらず感覚的に解りにくい。
全くSQL文を変更することなく、MViewを使用するQuery Rewrite機能を使用す
ればオプティマイザが自動的にMViewへアクセスするSQL文へ変更してくれる。
但し、Query Rewrite機能を使用するには幾つかの設定が必要だ。

条件1. コストベースでSQL文を実行すること
条件2. 初期化パラメータ”query_rewrite_enabled” が “true”に設定されてい
ること
条件3. MViewがquery rewrite可能になっていること

–上記条件の確認

SQL> sho parameter optimizer_mode
NAME                                 VALUE
------------------------------------ ------------------------------
optimizer_mode                       ALL_ROWS

SQL> sho parameter query_rewrite_enabled
NAME                                 VALUE
------------------------------------ ------------------------------
query_rewrite_enabled                TRUE


--MViewをquery rewrite可能に変更
SQL> alter materialized view mv_stock enable query rewrite;


--MViewがQuery Rewrite機能により使用されるか確認
SQL> select count(*) from tpc2.stock;

  COUNT(*)
----------
    500000

Elapsed: 00:00:00.02

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS
   1    0   MAT_VIEW REWRITE ACCESS (FULL) OF 'MV_STOCK' (MAT_VIEW REWRITE)

SQL文そのものはstock表への問い合わせであるが、実行計画を見るとMViewへ
アクセスしていることが判る。
また、レスポンスもかなり速くなっていることが実証できた。
来週に続く。

夏休みがやってきた茅ヶ崎より