为什么在较大的表上进行简单查询要慢得多?
问题描述:
我在表上运行一个简单的更新查询:为什么在较大的表上进行简单查询要慢得多?
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的可用磁盘空间。
答
更新性能下降是正常现象。问题是,索引需要在每次更新后更新。如果您将数据导入数据库,则应该使用数据库的批处理功能,临时禁用索引并在之后重新构建索引。
同为SQLite的,例如:Sqlite appending data performance linear degradation, is this solvable?
+0
在PostgreSQL中没有这样的“批处理功能”,你不得不自己重新创建索引。 –
它可能发生在交易:所有的更新都必须完成或拒绝。所以你可以在没有事务或更小的子集的情况下执行你的语句。 – Justas
我相信你不应该在一次交易中更新如此多的记录。我正在使用Firebird,它的行为方式也是一样。当我需要写入数据库(UPDATE,INSERT,DELETE)时,我注意不要改变超过50000条记录,但excact数取决于已更改的数据。基本上,你永远不应该改变一个事务中的1M记录。 –
你能否检查一下你是在交换20M的操作,而不是在1M的操作? –