なぜPostgreSQLのクエリのパフォーマンスの低下は、時間をかけて行いますが、インデックスを再構築するときに復元します

StackOverflow https://stackoverflow.com/questions/2392982

質問

マニュアル、indexes don't need to be maintainedでこのページによります。しかし、我々はupdatesdeletesinsertsその時間をかけて(数日)の連続速度を有し、PostgreSQLのテーブルで実行されていることは重要なクエリの劣化を見ています。私たちは、インデックスを削除して再作成する場合は、クエリのパフォーマンスが復元されます。

私たちは、ボックスの設定のうち使用しています。
我々のテストでの表は、現在空出始めて150万行に成長しています。 これは、かなり大規模な行(テキストフィールドの多くを)持っています。

我々はsearching based of an index, not the primary key(私はインデックスは、少なくとも通常の条件下では、使用されているを確認しました)。

の表は、単一のプロセスのための永続ストアとして使用されています。 JavaクライアントでWindowsでPostgreSQLを使用します。

私は、クエリのパフォーマンスを維持するためにinsert and update performanceをあきらめて喜んでます。

私たちは、データは、私たちはアプリケーションに影響を与えることなく、定期的にインデックスを削除して再構築することを可能にする方法で、様々な動的なテーブルに分散しているように、アプリケーションを再設計を検討しています。しかし、いつものように、そこに時間短縮が仕事にこれを取得することであり、私たちは私たちの設定や使用量の基本的な何かが欠けている疑います。

私たちはforcing vacuumingrebuild to run at certain times考えられてきたが、私はlocking period for such an action would cause our query to blockを疑います。これはオプションかもしれないが、私たちのコード内の他の変更を必要とするいくつかのリアルタイム(3-5秒の窓)の影響があります。

その他の情報:を テーブルとインデックス

CREATE TABLE icl_contacts
(
  id bigint NOT NULL,
  campaignfqname character varying(255) NOT NULL,
  currentstate character(16) NOT NULL,
  xmlscheduledtime character(23) NOT NULL,
...
25 or so other fields.  Most of them fixed or varying character fiel  
...
  CONSTRAINT icl_contacts_pkey PRIMARY KEY (id)
)
WITH (OIDS=FALSE);
ALTER TABLE icl_contacts OWNER TO postgres;

CREATE INDEX icl_contacts_idx
  ON icl_contacts
  USING btree
  (xmlscheduledtime, currentstate, campaignfqname);

分析します:

Limit  (cost=0.00..3792.10 rows=750 width=32) (actual time=48.922..59.601 rows=750 loops=1)
  ->  Index Scan using icl_contacts_idx on icl_contacts  (cost=0.00..934580.47 rows=184841 width=32) (actual time=48.909..55.961 rows=750 loops=1)
        Index Cond: ((xmlscheduledtime < '2010-05-20T13:00:00.000'::bpchar) AND (currentstate = 'SCHEDULED'::bpchar) AND ((campaignfqname)::text = '.main.ee45692a-6113-43cb-9257-7b6bf65f0c3e'::text))

そして、はい、私は物事のwe could do to normalize and improve the design of this tableのさまざまながあります認識しています。これらのオプションのいくつかは、私たちに利用できるかもしれません。

この問題の私の焦点は理解how PostgresQL is managing the index and query over time (understand why, not just fix)についてのです。それはオーバー行われたり大幅にリファクタリングするとしたら、多くの変更があるだろう。

役に立ちましたか?

解決

自動真空はトリックは、あなたがあなたの所望の性能のためにそれを設定して行う必要があります。

注: VACUUM FULL:これは、テーブルの統計情報とディスクスペースの再利用負荷を再構築します。これは、テーブル全体をロックします。

VACUUM:これは、テーブルの統計情報を再構築し、いくつかのディスク領域を解放します。これは、生産システムと並行して実行されますが、パフォーマンスに影響を与える可能性がIOの多くを生成することができます。

ANALYZE:これは、クエリプランナの統計情報を再構築します。これは、VACUUMによってトリガーされますが、自分自身で実行することができます。

より詳細なメモはここで見つける

他のヒント

パフォーマンスに関しては、

、時間とステータス情報を格納するための文字列を使用してはかなりのボトルネックです。まず、テキストのインデックスは、(あなたが使用される形式で)同じ日のニーズに少なくとも11の比較に2回を比較し、非常に非効率的である、しかし、時間のタイプを使用して、それは単に1回の比較に減少させることができます。これは、インデックスのサイズに影響し、大規模なインデックスがオーバー検索することは困難である、とDBはメモリに保管しないであろう。同じ考察が状態列に適用されます。したがって、インデックスのサイズ - それは州の小さなセットを表している場合、あなたは状態にマッピングされた番号の整数を使用する必要があり、これは、インデックスのノードを削減します。さらに、この指標はさえtheeseビルトインタイプのあなたは、クエリの実際の時間を指定しない場合。

を使用して役に立たないだろう

これは、私には、インデックスの膨張のようなにおい。このページにあなたを参照してくださいI'l

http://www.postgresql.org/docs/8.3/静的/ルーチン-reindex.htmlする

下部に言う

  

また、B-treeインデックスするA   新たに構築されたインデックスが多少あります   高速アクセスを持っているものよりも   ので、何度も更新されて   論理的に隣接したページは、通常、   また、物理的に隣接し、新た中   構築されたインデックス。 (この考慮事項はありません   現在、B-tree以外には適用されません   インデックス。)それが価値があるかもしれません   ただ改善するために、定期的にインデックスを再作成   アクセス速度ます。

あなたはインデックス「は、メンテナンスやチューニングを必要としない」と言って参照されたページと競合するように見えるん

あなたが「同時にインデックスを作成する」を試みたことがありますか?

は '2010-05-20T13:00:00.000' ですか?xmlscheduledtimeはSQLの一部と比較し、又はAパラメーター

として供給されている値

ときにどのようにフィールドが上に行くためにはPostgreSQLに多くを与えるものではありません、まだ未知の値で指定されたパラメータよりも小さくなければならないと言って、クエリを実行することを計画。それはそれはほぼすべての行を一致させる、またはほとんどすべての行のだろうかどうか分かりません。

プランナーが使用する統計をどの程度

レディングデータベースが、それはある計画を使用している理由を理解しようとすると、途方に役立ちます。

その後、インデックスはストレートキャンペーンFQ名が表示されますので、フィールドは(campaignfqname、currentStateの、xmlscheduledtime)を注文して

あなたは、その複雑なインデックスのフィールドの順序を変更したり、新しいインデックスを作成することで、より良い選択のパフォーマンスを得る可能性がありますあなたが興味を持っている、とxmlscheduledtime範囲にわたるインデックス・スキャンは、すべてあなたが後にしている行になると、現在の状態。

これは教科書のケースです。あなたはセットアップ自動バキュームが多く、より積極的であることをする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top