0

次のpostgresqlテーブルがあります:

CREATE TABLE "initialTable" (
    "paramIDFKey" integer,
    "featAIDFKey" integer,
    "featBIDFKey" integer,
    "featAPresent" boolean,
    "featBPresent" boolean,
    "dataID" text
);

次のコマンドでこのテーブルを更新します。

UPDATE "initalTable" 
SET "dataID" = "dataID" || '#' || 'NEWDATA' 
where 
    "paramIDFKey" = parameterID 
    and "featAIDFKey" = featAIDFKey 
    and "featBIDFKey" = featBIDFKey 
    and "featAPresent" = featAPresent 
    and "featBPresent" = featBPresent

ご覧のとおり、各行の dataID を更新しています。この更新は追加として機能します。以前のデータに新しいデータを追加します。

これは遅すぎます。特に「dataID」列が大きくなる場合。

以下は、「説明」の結果です。

"Bitmap Heap Scan on "initialTable"  (cost=4.27..8.29 rows=1 width=974)"
"  Recheck Cond: (("paramIDFKey" = 53) AND ("featAIDFKey" = 0) AND ("featBIDFKey" = 95))"
"  Filter: ("featAPresent" AND (NOT "featBPresent"))"
"  ->  Bitmap Index Scan on "InexactIndex"  (cost=0.00..4.27 rows=1 width=0)"
"        Index Cond: (("paramIDFKey" = 53) AND ("featAIDFKey" = 0) AND ("featBIDFKey" = 95) AND ("featAPresent" = true) AND ("featBPresent" = false))"

説明する ANALYZE:

"Bitmap Heap Scan on "Inexact2Comb"  (cost=4.27..8.29 rows=1 width=974) (actual time=0.621..0.675 rows=1 loops=1)"
"  Recheck Cond: (("paramIDFKey" = 53) AND ("featAIDFKey" = 0) AND ("featBIDFKey" = 95))"
"  Filter: ("featAPresent" AND (NOT "featBPresent"))"
"  ->  Bitmap Index Scan on "InexactIndex"  (cost=0.00..4.27 rows=1 width=0) (actual time=0.026..0.026 rows=1 loops=1)"
"        Index Cond: (("paramIDFKey" = 53) AND ("featAIDFKey" = 0) AND ("featBIDFKey" = 95) AND ("featAPresent" = true) AND ("featBPresent" = false))"
"Total runtime: 13.780 ms"

およびバージョン:

"PostgreSQL 8.4.14, compiled by Visual C++ build 1400, 32-bit"

何か提案はありますか?

4

1 に答える 1

0

まず、これが本当の問題であるとはまったく確信していません。1 つのクエリに対して 15 ミリ秒では長すぎる場合は、開始して、最適化が時期尚早ではないか、それが本当にボトルネックになっていないかを確認する必要があります。そうである場合は、データベースの使用方法を再検討することをお勧めします。クエリは、Explain Analyze の提案よりも高速に実行できることに注意してください (一部のクエリは、EXPLAIN ANALYZE で 4 倍遅く実行されるのを見てきました)。したがって、アプリケーションのプロファイリングから始めて、実際のボトルネックを探してください。

そうは言っても、これがボトルネックであることがわかった場合は、インデックスが作成されているものを詳しく調べることができます。インデックスが多すぎると、書き込み操作が遅くなり、更新クエリに関係します。これは、更新内のすべての列に新しいインデックスを追加し、必要に応じて他のインデックスを削除することを意味する場合があります。ただし、そのクエリからさらに多くの情報が得られるとは考えていません。

于 2013-10-26T09:10:37.343 に答える