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))"

解释分析:

"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

首先,我完全不相信这是一个真正的问题。如果 15 毫秒对于单个查询来说太长,您需要开始并询问您是否过早优化以及是否真的是瓶颈。如果是,您可能需要重新考虑如何使用数据库。请记住,查询可以比解释分析建议执行得更快(我已经看到一些查询在 EXPLAIN ANALYZE 下运行速度慢 4 倍)。因此,首先分析您的应用程序并寻找真正的瓶颈。

话虽如此,如果您确实发现这是一个瓶颈,您可以仔细查看索引的内容。太多的索引会减慢写入操作,这与更新查询有关。这可能意味着在更新中添加一个包含所有列的新索引,并根据需要删除其他索引。但是,我真的不认为您会从该查询中获得更多信息。

于 2013-10-26T09:10:37.343 回答