Full Scanを速くしちゃう その7
<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へ
アクセスしていることが判る。
また、レスポンスもかなり速くなっていることが実証できた。
来週に続く。
夏休みがやってきた茅ヶ崎より