2012-11-28 8 views
8

大規模なpostgresコレクションに基づくページのページ生成を高速化するために、クエリ結果をmemcacheにキャッシュします。しかし、非常に大きな不変なコレクションやアクセスがほとんどないコレクションでは、サーバー側のカーソルをポストグルに保存する方が実行可能な代替のキャッシュ戦略になるのではないかと思います。キャッシュ用のpostgresサーバー側カーソルを使用

コレクションの途中でページを提供した後で、コレクション内の他の場所のランダムなクエリよりも、「次の」リンクと「前の」リンクが使用される可能性が高くなります。クエリの大規模な起動コスト(避けられないような)を避けるために、近隣に「WITH HOLD」というカーソルを付けることができますか?

サーバー上のリソース消費については不思議です。コレクションが不変の場合、カーソルを保存するのにあまり多くのリソースは必要ないはずですが、私はこの点で最適化されたpostgresがどのようになっているのだろうかと思います。さらなるドキュメンテーションへのリンクがあれば幸いです。

+0

私が想定するキャッシング戦略は、固定数のカーソルを格納することです。特定のクエリの近くにある場合は、結果のページを取得するために使用されます。さもなければ最も長く使用されなかったカーソルはリセットされます。 – shaunc

答えて

3

あなたは多くの問題を抱えています。あなたは、D」

  • は、同じユーザーが同じSQL接続
  • あなたはカーソルが真空操作を開催しますクリーンアップ作戦
  • を作成する必要がありますを取得することを確認する必要があります。
  • カーソルをクリアしないように接続プールに納得させる必要があります
  • 私が言及していない他の問題が考えられます。

要するに:しないでください。次回/前のページをバックグラウンドであらかじめ計算してmemcachedに保存するのはどうでしょうか?

+0

hmm--私は、文書のどこでカーソルと接続の関係について議論するのか教えてください。 「保留」がないと、カーソルはトランザクション内でのみ有効ですが、トランザクションのカーソルの依存性については言及していません。http://www.postgresql.org/docs/9.2/static/sql-declare .html – shaunc

+0

UPDATE: "同じセッションで後続のトランザクション*にアクセスし続けることができます*" - sigh ... precalcはまだスキャンを複製しますが、>(最後のPKまたはクエリがソートされたもの)これを避けてください。 OK – shaunc

関連する問題