ヒートマップ、どう使う?
谷川:今回はASMやヒートマップの話をしましょうか。データライフサイクルはこれまでストレージレベルでやっていました。データベースのレベルでやるというのはすんなり理解できましたか?
新久保:むしろストレージで管理していたILMというのはあまり機能しているのを見たことがないです。ストレージのレイヤレベルでデータを配置したところでアプリケーションのアクセス頻度とはまた違うので。
データベースでやるなら、レコード、セグメント、さらにテーブルレベルで見ることになり、それは意味があるかなと思います。レンジパーティションとヒートマップとか使いやすそう。
谷川:レンジパーティションなら時系列の塊でデータを管理するので、過去のものの取り扱いはアーカイブに近いからね。
新久保:リスクも少なそう。
谷川:ヒートマップの仕組みはASMと密接だと思うけど、必須?
新久保:関係ないです。しかしオーバーヘッドが気になります。アクセスごとにヒートマップのディクショナリーを作るのだし。
谷川:ヒートマップのディクショナリーってSQLとかで見られたりするのかな?
近藤:見えます。
新久保:「v$ ペケペケ」という感じの構文です。 (※新久保補足参照)
谷川:見て分かるものなの?
新久保:例えばこのテーブルで何ブロック読まれているとか、スキャンしたとか。この情報はチューニングや何かに使えるんじゃないかってやらしい気持ちが(笑)。ただライセンス的にはオプションが必要ですけど。
近藤:Advanced Compression Optionのライセンスが必要です。
谷川:このデータを解析するツールとか出てきそう。
新久保:そりゃもうすぐに(笑)。
谷川:需要ありそう。
新久保:12c以前から「手軽に不要なインデックスを知りたい」という要望があります。インデックスをモニタすればいいのですが、負荷や設定で抵抗感あるお客さんが多くて。これからはヒートマップを見れば使われていないインデックスが分かり、安全に捨てることもできると思います。しかしそのために「Advanced Compression Optionのライセンスを買って」とは言えないんですが。
谷川:買ってくれた相手にはコンサルができますよね。
新久保:それで「このゴミのようなインデックスが……」と口を滑らせて怒られちゃったりして(笑)。
一同:(笑)。
※新久保補足
HEAT_MAPに関して
HEAT_MAP機能が有効化されていると様々な粒度でのアクセス統計が取得される。取得されるアクセス統計は、大きく以下の4つ
- ブロックレベル
- エクステントレベル
- オブジェクト/セグメントレベル
- テーブルスペースレベル
これらの情報はv$heat_map_segmentやdbms_heat_mapパッケージにより確認可能。
# ブロックレベルで対象のオブジェクト(この場合はテーブル)のアクセス統計を確認する場合 SQL> select * from table(dbms_heat_map.block_heat_map('SOE','ORDERENTRY_METADATA')); OWNER SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME FILE_ID RELATIVE_FNO BLOCK_ID WRITETIME ----- ------------------------------ --------------- --------------- ---------- ------------ ---------- --------- SOE ORDERENTRY_METADATA SOE 1024 1018128 SOE ORDERENTRY_METADATA SOE 1024 1018129 SOE ORDERENTRY_METADATA SOE 1024 1018130 SOE ORDERENTRY_METADATA SOE 1024 1018131 ... # エクステントレベルで対象のオブジェクト(この場合はテーブル)のアクセス統計を確認する場合 SQL> select * from table(dbms_heat_map.extent_heat_map('SOE','ORDERENTRY_METADATA')); OWNER SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME FILE_ID RELATIVE_FNO BLOCK_ID BLOCKS BYTES MIN_WRITE MAX_WRITE AVG_WRITE ----- ------------------------------ --------------- --------------- ---------- ------------ ---------- ---------- ---------- --------- --------- --------- SOE ORDERENTRY_METADATA SOE 1024 1018128 16 131072 # オブジェクトレベルで対象のオブジェクト(この場合はテーブル)のアクセス統計を確認する場合 SQL> select * from table(dbms_heat_map.object_heat_map('SOE','ORDERENTRY_METADATA')) OWNER SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME SEGMENT_TYPE SEGMENT_SIZE MIN_WRITE MAX_WRITE AVG_WRITE MIN_READT MAX_READT AVG_READT MIN_FTSTI MAX_FTSTI AVG_FTSTI MIN_LOOKU MAX_LOOKU AVG_LOOKU ----- ------------------------------ --------------- --------------- -------------------- ------------ --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- SOE ORDERENTRY_METADATA SOE TABLE 1048576 # テーブルスペースレベルのアクセス統計を確認する場合 SQL> select * from table(dbms_heat_map.tablespace_heat_map('SOE')); TABLESPACE_NAME SEGMENT_COUNT ALLOCATED_BYTES MIN_WRITE MAX_WRITE AVG_WRITE MIN_READT MAX_READT AVG_READT MIN_FTSTI MAX_FTSTI AVG_FTSTI MIN_LOOKU MAX_LOOKU AVG_LOOKU --------------- ------------- --------------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- --------- SOE 188 2.4721E+10
≪気になったら今すぐトライアル!≫
Oracle Database 12c トライアル・キャンペーン!
Oracle Database 12cは、もうお試しになりましたか?
Oracle Technology Networkでは、Oracle Database 12cのリリースを記念して、トライアル・キャンペーンを実施中です。 Oracle Database 12c 試用版ソフトウエアをお試しいただき、アンケートに回答していただいた方の中から、合計1,212名様にOracle Database 12cロゴ入りのスペシャルグッズをプレゼントします。Oracle Databaseを使用しているデータベースエンジニアの皆様、ぜひ挑戦してみてください!