1

グローバル一時テーブルを使用して、高価な中間データを保存したいと考えています。データは一時的なものですが、php セッションの期間中は適切であるため、グローバル一時テーブルを使用on commit preserve rowsするのが理想的です。

しかし..グローバル一時テーブルデータは、それを作成したOracleセッションでのみ利用できるようです。

したがって、これにより、oci_pconnect が同じ Oracle セッションを確実に取得できるようにするにはどうすればよいかという問題が生じます。Oracle セッションは永続的な接続ごとに一意であると読んだことがあります。複数のphp実行でトランザクションを使用することには興味がありません。一時テーブルだけです。

Oracleセッションを選択するための識別子として使用できるように、phpセッションを使用しています。

これまでのところ、これは不可能のようですが、質問しても問題ありません。

EDIT : これを実装する目的は、アクセス制御で使用されるユーザー グループ メンバーシップ情報へのアクセスを高速化することです。
事前にグループ メンバーシップを解析し、代わりにこの一時データを使用すると、後続のすべてのクエリで 3 つ以上の結合レイヤーが不要になります。返されたキーはRAWであるため、それらを外部ストレージにシリアル化すると、HEXTORAW()再度使用時に多くの呼び出しが発生し、意図した目的には役立たないようです。

グループ レベルのアクセスを決定するために追加されたクエリの部分は、セッションの間静的であり、単独で実行されると、約 600 行の一意の 16 バイトRAWキーが返されます。次に、これらのキーは、リンク テーブルを介して結果セットに対して結合され、ユーザーが結果セットに対して「グループ レベル」の権限を持っているかどうかが判断されます。

IN を使用してキーを文字列として渡してみましたが、それらは RAW キーであるため、HEXTORAW()クエリごとに 600 回呼び出す必要があります。パフォーマンスは、一時テーブルを使用してJOIN.

「永続的な」中間結果に書き込む以外に、クエリのその部分の結果をキャッシュしておくようにOracleに指示する他の方法はありますか?

4

2 に答える 2

0

「データベース常駐接続プーリング」はどうですか。これがあなたが探しているものだと思います。試してみます!

于 2013-12-25T11:58:08.710 に答える
0

これを機能させるための策略を思い付くことができるかもしれませんが、少なくとも場合によっては、特に開発サーバーから実稼働サーバーに移行するときに、これはある時点でほぼ確実に問題を引き起こすものであることをお勧めします。 . オプションには次のものがあります。

  1. 永続的なテーブルを使用し、論理的に処理が完了したらデータを消去します。
  2. データをフラット ファイルに書き込み、必要に応じて読み戻します。
  3. データをフラット ファイルに書き込み、そのファイルを外部テーブルとしてマウントします。

共有してお楽しみください。

于 2012-05-11T17:25:00.153 に答える