0

SQL/RDBMS は初めてです。

libpq ライブラリを使用して、PostgreSQL サーバーに 10 列の行を追加するアプリケーションがあります。現在、サーバーはビジュアル C++ アプリケーションと同じマシンで実行されています。

約 1500 万から 2000 万のレコードを追加しました。合計カウントを取得する単純なクエリは、 を使用して 4 ~ 5 分かかりselect count(*) from <tableName>;ます。

データを入力している時間 (タイムコード) でテーブルにインデックスを付けました。WHEREほとんどの場合、さまざまな/AND句を追加してカウントする必要があります。

物事を速くする方法はありますか?サーバーがネットワークに移動すると、処理が大幅に遅くなるため、できるだけ高速にする必要があります。

ありがとう

4

3 に答える 3

2

ネットワーク レイテンシが、クエリにかかる時間の大きな要因になるとは思いません。すべての処理は PostgreSQL サーバー上で行われています。

PostgreSQL MVCC の設計では、テーブル内の各行 (インデックスだけでなく) を調べてカウント (*) を計算する必要がありますが、これはコストのかかる操作です。あなたの場合、多くの行が関係しています。

このトピックに関する優れた wiki ページがhttp://wiki.postgresql.org/wiki/Slow_Countingにあります。

このリンクからの 2 つの提案。1 つはインデックス列を使用することです。

select count(index-col) from ...;

...ただし、これは特定の状況でのみ機能します。

複数のインデックスがある場合は、次を使用してコストが最も低いインデックスを確認します。

EXPLAIN ANALYZE select count(index-col) from ...;

おおよその値を使用できる場合は、次のようなおおよその値に Postgres 固有の関数を使用することもできます。

select reltuples from pg_class where relname='mytable';

この近似値がどれだけ適切かは、autovacuum が実行されるように設定されている頻度やその他の多くの要因によって異なります。コメントを参照してください。

于 2012-07-28T12:08:37.340 に答える
1

考えpg_relation_size('tablename')て、それを費やした秒数で割ります

select count(*) from tablename

これにより、このテーブルのフルスキャンを実行するときにディスクのスループットが得られます。それが低すぎる場合は、そもそもそれを改善することに集中したいと思うでしょう。データベースには、優れたI/Oサブシステムと優れたパフォーマンスのオペレーティングシステムディスクキャッシュが不可欠です。

デフォルトのpostgres構成は、他のアプリケーションとうまく連携するために多くのリソースを消費しないことを目的としています。ハードウェアとマシンの全体的な使用率に応じて、 shared_bufferseffective_cache_sizework_memなどのいくつかのパフォーマンスパラメーターを調整することをお勧めします。特定のバージョンのドキュメントとWikiのパフォーマンス最適化ページを参照してください。

また、結果の行が1つだけ取得されるため、スタイルクエリの速度はネットワークやネットワークselect count(*)とは関係がないことに注意してください。libpqそれは完全にサーバー側で発生します。

于 2012-07-28T15:43:59.643 に答える
0

データが何であるかを述べることはありませんが、通常、非常に大量のデータを含むテーブルを処理する理由は、テーブルをパーティション化するためです。http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

これによってselect count(*) from <tableName>;クエリが高速化されることはなく、速度が低下することもありますが、通常、テーブル内のデータの一部のみに関心がある場合は、これが役立つ可能性があります。

于 2012-07-29T01:28:33.577 に答える