|
|
1
13
看看这个答案: PostgreSQL slow on a large table with arrays and lots of updates 首先从更好的填充因子开始,执行真空填充以强制重写表,并在更新查询后检查热更新:
当您有很多记录需要更新时,热更新会更快。有关Hot的更多信息,请参见 article . 另外,您需要8.3版或更高版本。 |
|
|
2
28
我必须用每行的不同值更新10亿或20亿行的表。每次运行都会产生约1亿次变化(10%)。 我的第一个尝试是将它们分组到特定分区上的300K更新事务中,因为如果使用分区,PostgreSQL并不总是优化准备好的查询。
根据可用的RAM,在缓冲区中积累大量更新 当它被填满,或者需要更改表/分区,或者完成时:
这意味着现在一次运行需要1.5小时而不是18小时进行1亿次更新,包括真空。 |
|
|
3
7
在等了35分钟后,我决定尝试一些不同的方法来完成更新查询(但仍然没有完成)。所以我做的是一个命令:
然后添加索引,然后删除旧表并重命名新表以取代它。这只需要1.7分钟的处理时间,再加上一些额外的时间来重新创建索引和约束。但它确实有帮助!:) 当然,这只是因为没有其他人在使用数据库。如果是在生产环境中,我需要首先锁定表。 |
|
|
4
2
今天我花了很多时间处理类似的问题。我找到了一个 solution : 在更新之前删除所有约束/索引 . 无论正在更新的列是否已编入索引,PSQL似乎都会更新所有已更新行的所有索引。更新完成后,重新添加约束/索引。 |
|
|
5
2
试试这个(注意
这将重写表,类似于drop+create,并重新生成所有索引。但都是一个命令。速度快得多(大约是2倍),而且您不必处理依赖关系,也不必重新创建索引和其他内容,尽管它确实会在持续时间内锁定表(访问独占,即完全锁定)。或者,如果你想让其他一切都排在它后面,那也许就是你想要的。如果不更新“太多”行,那么这种方式比只更新慢。 |
|
|
6
0
你是怎么运作的?如果循环每一行并执行update语句,则可能会运行数百万个单独的更新,这就是为什么它的执行速度会非常慢的原因。 如果您在一条语句中为所有记录运行一条UPDATE语句,那么它的运行速度会快得多,如果这个过程很慢,那么它可能比任何其他语句都更依赖于您的硬件。300万是很多记录。 |
|
|
7
0
我建议的第一件事 https://dba.stackexchange.com/questions/118178/does-updating-a-row-with-the-same-value-actually-update-the-row )只更新“需要”它的行,例如:
(可能还需要GeneralFreq的索引)。然后更新更少的行。尽管如果值都不是零,但更新更少的行“有帮助”,因为否则它会更新它们和所有索引,而不管值是否更改。 另一个选项:如果星按照默认值和非空约束对齐,则可以删除旧列并创建 another 只需调整元数据,即时时间。 |
|
|
8
0
在我的测试中,我注意到一个大的更新(超过200000行)比两个100000行的更新(即使是临时表)慢。 我的解决方案是循环,在每个循环中创建一个由200000行组成的临时表,在这个表中我计算我的值,然后用新值更新主表。 每2000000行,我手动“真空分析我的表”,我注意到自动真空不适合这样的更新。 |
|
|
9
-2
尝试
也许这是一个演员问题 |
|
John Beasley · 更新一定数量记录的连续日期 1 年前 |
|
OcMaRUS · PostgreSQL:意外更新数据库中的所有记录 2 年前 |
|
|
Community wiki · 这个MySQL语句出了什么问题? 2 年前 |
|
|
Andrew · 如何根据字母排序顺序设置int值 8 年前 |
|
|
BCH · 从Select更新-语法和概念检查(mySQL) 8 年前 |