为什么在较大的表上进行简单查询要慢得多?

问题描述:

我在表上运行一个简单的更新查询:为什么在较大的表上进行简单查询要慢得多?

UPDATE table_x SET col_a = (col_b AT TIME ZONE 'UTC') AT TIME ZONE col_tz; 

当TABLE_X包括100个条目,查询需要一些毫秒。
- > 100'000条目= 2秒。
- > 1'000'000条目= 20秒。
到目前为止这么好。但是当表格由20M条目组成时,查询将永远运行!有人知道这个原因吗?可以做些什么来克服这一点?

也许我应该补充一点,我的计算机上只剩下大约13 GB的可用磁盘空间。

+0

它可能发生在交易:所有的更新都必须完成或拒绝。所以你可以在没有事务或更小的子集的情况下执行你的语句。 – Justas

+0

我相信你不应该在一次交易中更新如此多的记录。我正在使用Firebird,它的行为方式也是一样。当我需要写入数据库(UPDATE,INSERT,DELETE)时,我注意不要改变超过50000条记录,但excact数取决于已更改的数据。基本上,你永远不应该改变一个事务中的1M记录。 –

+1

你能否检查一下你是在交换20M的操作,而不是在1M的操作? –

更新性能下降是正常现象。问题是,索引需要在每次更新后更新。如果您将数据导入数据库,则应该使用数据库的批处理功能,临时禁用索引并在之后重新构建索引。

同为SQLite的,例如:Sqlite appending data performance linear degradation, is this solvable?

+0

在PostgreSQL中没有这样的“批处理功能”,你不得不自己重新创建索引。 –