Postgres-行数与查询速度之间的非线性关系

时间:2018-11-07 18:17:47

标签: postgresql database-performance

为什么要处理的行数与所花费的时间之间没有直接(线性)关系?

示例-我正在将行从一个表移动到另一个表。如果我移动一百万行,大约需要20秒,如果我移动一千万行,它不需要需要200秒(大约4分钟),则大约需要20分钟,如果我移动2000万,行大约需要2个小时。

背景-我通过将以下查询作为单个事务运行,将每日分区合并为较大的每月分区。...

ALTER TABLE table_a DETACH PARTITION table_a_201811; 
ALTER TABLE table_a DETACH PARTITION table_a_20181104; 
WITH moved_rows AS 
( 
    DELETE FROM table_a_20181104 
    RETURNING * 
) 
INSERT INTO table_a_201811 
SELECT * FROM moved_rows; 
ALTER TABLE table_a ATTACH PARTITION table_a_201811 FOR VALUES FROM ('2018-11-01') TO ('2018-11-05'); 
DROP TABLE table_a_20181104;

实验表明,用于分离/附加分区的ALTER TABLE命令仅花费几秒钟(看似与表大小无关),而中间的语句表明实际进行转移需要花费大量时间。

我曾想过,如果要花x秒才能移动一百万行,那么要花2x秒才能移动200万行,而要花10x秒才能移动1000万行。似乎并非如此。为什么不? -并且有提高性能的方法吗?

我正在使用版本10.5,并且该进程具有对数据库的独占访问权限(没有其他连接,并且pg_locks中没有显示锁。

0 个答案:

没有答案