在 Ubuntu 12.04 上使用 PG 9.1。
目前,我们在数据库上运行大量 UPDATE 语句最多需要 24 小时,它们的形式如下:
UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
Run Code Online (Sandbox Code Playgroud)
(我们只是覆盖由 ID 标识的对象的字段。)这些值来自外部数据源(尚未在数据库中的表中)。
每个表都有几个索引,没有外键约束。直到最后都没有提交。
导入pg_dump
整个数据库的一个需要 2 小时。这似乎是我们应该合理定位的基线。
除了生成以某种方式重建数据集以供 PostgreSQL 重新导入的自定义程序之外,我们是否可以做些什么来使批量 UPDATE 性能更接近导入的性能?(这是一个我们认为日志结构合并树处理得很好的领域,但我们想知道是否可以在 PostgreSQL 中做任何事情。)
一些想法:
基本上有很多事情要尝试,但我们不确定什么是最有效的,或者我们是否忽略了其他事情。我们将在接下来的几天里进行实验,但我们想我们也会在这里问。
我确实在表上有并发负载,但它是只读的。
我们在 Postgres 中有一个 2.2 GB 的表,其中有 7,801,611 行。我们正在向它添加一个 uuid/guid 列,我想知道填充该列的最佳方法是什么(因为我们想NOT NULL
向它添加约束)。
如果我正确理解 Postgres,更新在技术上是删除和插入,所以这基本上是重建整个 2.2 gb 表。我们还有一个奴隶在运行,所以我们不希望它落后。
有没有比编写一个随着时间慢慢填充它的脚本更好的方法?
我在 Ubuntu 上使用 PostgreSQL 9.1。VACUUM ANALYZE
仍然推荐预定,还是 autovacuum 足以满足所有需求?
如果答案是“视情况而定”,那么:
我问是因为预定的时间VACUUM ANALYZE
会影响我的报告。它运行了 5 个多小时,本周我不得不杀死它两次,因为它影响了常规的数据库导入。check_postgres
不会报告数据库有任何显着膨胀,所以这不是真正的问题。
从文档中,autovacuum 也应该处理事务 ID 环绕。问题是:我还需要一个VACUUM ANALYZE
吗?
我只知道一点 sql 基础知识,需要编写一个简单的 sql 语法荧光笔/检查器所以我正在努力通过标准......我偶然发现了一些我不确定我是否理解正确的东西,因为我从未见过有人使用一个SET
以这种方式。
它的定义如下所示:
<multiple column assignment> ::=
<set target list> <equals operator> <assigned row>
Run Code Online (Sandbox Code Playgroud)
以这种方式定义设置目标列表的地方:
<set target list> ::=
<left paren> <set target> [ { <comma> <set target> }... ] <right paren>
Run Code Online (Sandbox Code Playgroud)
这对我来说听起来是可以做到的:
UPDATE ...
SET (A, B, C) = (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
将 A 的值更新为 1,B 的值更新为 2,C 的值更新为 3。
我让反刍的是=
因为我从来没有见过这样的 SET 并且在网上找不到任何使用这种方式的例子。
所以我也不确定是否正确理解整个定义。
有人能告诉我这是正确的吗?如果不是这样,你能解释一下这个定义的其他定义吗?
postgresql ×3
bulk ×1
ddl ×1
etl ×1
performance ×1
sql-standard ×1
storage ×1
update ×1
vacuum ×1