[Database] More on PHP and Oracle 11gR2 Improvements to Client Result Caching

Oracle 11gR2はClient Result Caching(以下、CRC)が改善されています。CRCはクエリの結果を再利用のためにデータベースのクライアントプロセスにキャッシュするというものです。Oracle OpenWorldのプレゼンテーション "Best Practices for Developing Performant Application" で、同僚のLuxi Chidambaranが(PHPで生成されていない)Nilesベンチマークのグラフを紹介していました。そこには、DBのCPU使用率が1/6に、レスポンスタイムもCRC利用時よりも22%高速になったことが示されてしました。
CRCは時に”Consistent Client Cache”と言われることもあります。それは表のデータを変更した場合キャッシュをOracle databaseが自動的に無効にするからです。これにより、アプリケーションロジックを書き直す必要なくCRCを気安く使うことができるのです。CRCを有効化してチューンするいくつかの簡単なデータベースの設定があります。管理もまた簡単です。
データベースクライアントとしてのPHP OCI8はCRCを使います。キャッシュはプロセス毎なので、大きなデータセットをキャッシュする前には注意して計画する必要があります。キャッシュの候補となる表は、ネットワーク転送のコストが大きい検索テーブルです。
CRCは11gR2で本当に簡単になっています。一瞬で設定できることでしょう。Oracle 11gR1でも非常に簡単でしたが、ちょっとした小さなアプリケーションの変更が必要でした。PHPでは、次のように使っていました。
$s = oci_parse($c, "select /*+ result_cache */ * from employees");
oci_execute($s, OCI_NO_AUTO_COMMIT); // Use OCI_DEFAULT in OCI8 <= 1.3
oci_fetch_all($s, $res);
このことは過去のエントリに記載しました。クエリには結果をキャッシュするための特定のヒント句を含めておき、OCI_DEFAULTフラグやOCI_NO_AUTO_COMMITフラグを使って実行している間はオートコミットを無効にする必要がありました。多くの人はクエリのコミットの状態を具体的に知らないので、コミット禁止のフラグルールは合理性を欠くように思います。

Oracle Database 11gR2では、DBAがCREATE TABLEもしくはALTER TABLEでキャッシュの対象とする表を指名することができます。つまり、ヒント句を使う必要がないということです。また、コミット禁止フラグも不要になりました。これにより、コードはこんな感じになります。
$s = oci_parse($c, "select * from employees");
oci_execute($s);oci_fetch_all($s, $res);
あなたのコードはおそらく既に上記のようになっているかと思うので、DBAはデータベースの上位クエリを見つけて、データベースのCRCを有効にしてALTER TABLE文を候補の表に対して発行することで、表をシステムをチューンすることができます。Oracle Database 11gR2におけるCRCの改善点は、この他にデータベース常駐接続プーリング(Database Resident Connection Pooling)で動作するというものです。

キャッシュ対象の表を判断するためのガイドになるよい資料がありますので、マニュアルを参照してください。11gR1を使っている場合、もしくはデータベース常駐接続プーリングを使わない「専用サーバ」を使っている場合は、接続を永続化する oci_pconnect() を利用することに注意してください。また、SQLT_INTとしてバインドできる場合でも、PHPでは、クエリ中の文字列をバインドしないでください。

Oracle® Call Interface Programmer's Guide 11g Release 2 (11.2)
Client Result Cache
http://download.oracle.com/docs/cd/E16338_01/appdev.112/e10646/oci10new.htm#CHDGGFEF


原文はこちら。
http://blogs.oracle.com/opal/2011/03/more_on_php_and_oracle_11gr2_i.html

0 件のコメント:

コメントを投稿