2014年4月27日日曜日

SmartScanの検証


最近、業務でExadataを触っておりますが、Exadataの特徴の一つとしてSmartScanがあります。
通常、データベース側でSQL文を発行すると、ストレージからデータを取ってきて、データベースで必要な情報を抽出してSQLを実行します。
これをExadataでは、ストレージ側でデータベースに渡すデータをあらかじめ抽出することによって物理I/Oを減らす機能です。
SmartScanを有効にするには、Direct Path Readである必要があります。
実行計画でDirect Path Readを選択してくれないと、Smart Scanが効かないのが問題となる可能性があります。
一応、こんな方法でSmartScanを効かすことはできます。
alter session set "_serial_direct_read"=true;

とはいえ、アプリ側でalter文を発行するのも嫌、というのはあると思いますので、もう少し調べてみました。
すると、こんな隠しパラメータを見つけました。
_small_table_threshold
11.2からは、セグメントサイズが 5×_small_table_threshold×blocksize以上の場合、Direct Path Readを選択するようです。
ちなみに、_small_table_thresholdはデフォルトではバッファキャッシュの2%になるような値にセットされるようです。
つまり、バッファキャッシュを大きくすればするほど、DirectPathReadは効きづらくなるということのようです。

ただ、セグメントサイズ > 5×_small_table_threshold×blocksizeの場合であっても、SmartScanにならない事象が発生してしまいました。
これについては、OracleACEの渡部さんが、TanelPoderさんのブログを翻訳してくださっています(素晴らしい!)。
http://www.csus4.net/d/japanese_translations_of_tanel_poder_s_posts_and_articles/optimizer-statistics-driven-direct-path-read-decision-for-full-table-scans-_direct_read_decision_statistics_driven-ja/

11.2.0.2から少し事情が違うようです。
もう少し検証が必要そうです。

0 件のコメント:

コメントを投稿