3

重複の可能性:
PostgreSQL のカウント クエリの最適化

PostgreSQL 9.2 を使用して、クエリの結果の数を追跡し、その数を効率的な方法で返す方法があるかどうかを調べようとしています。このクエリは、毎秒数回 (場合によっては数十から数百、さらには数千回) 実行する必要があります。現在のクエリは次のようになりますが、これは非効率的ではないでしょうか。

-- Get # of rows that do not have ‘parameter value’ in array_column
select count(*) 
    from table
    where not (ARRAY[‘parameter value’] <@ table.array_column)

私の質問は次のとおりです(回答は複数の問題を同時に解決する可能性があります):

そのクエリのcount(id)(またはそれについては)線形クエリですか?count(*)(O(n))

PostgreSQL でこのクエリをより効率的にする方法はありますか? さまざまなパラメーター値を照会する必要があることを覚えておいてください。そのため、具体化されたビューを保持することは現実的ではないと考えています (ただし、パラメーター値ごとに 1 つを作成する方が良いと考えられる場合は検討する可能性があります)。

クエリのパフォーマンスを向上させるために、クエリ、データベース構造、または PostgreSQL サーバーの構成に変更を加える必要はありますか?

ポインタや提案は大歓迎です。これが完全に間違った方法である場合は、お知らせください。

編集

回答されたことを考慮して、具体化されたビューを使用するのが妥当かどうか疑問に思っていました。これは、いくつかの具体化されたビューを持つことを意味します (それぞれが異なるパラメーター値に対応し、その値が存在しない行を持ちます)。パラメータ値はある程度予測可能であるため、これは解決策としてはそれほど遠くないようです。ここで別の問題が生じます。具体化されたビューはここで役立ちますか? データベースで作成できるマテリアライズド ビュー (またはテーブル) の数に関して、(定義またはパフォーマンスのいずれかで) 制限はありますか?

4

1 に答える 1

1

頭に浮かぶ最初のアイデアは、値をキャッシュすることです。

この値の変化率を評価し、それに応じて、このテーブルが更新されたときにトリガーを実行して新しい値を計算し、どこかにキャッシュするかどうかを決定する必要があります。

その値の結果のクエリは、WHERE 句のない単純な SELECT になるため、非常に高速になります。

または、単に変更を行い、速度が向上したかどうかを知るために、前後の統計を取得することもできます.

詳細については、そこを参照してください。

于 2012-10-25T22:18:56.180 に答える