我在Postgres中有一个5000万行的表tbl
。tbl
在column_1
上有一个索引,并且有很多对这个表的查询,比如
select * from tbl
where column_1 = 'value'
字符串
每个查询返回0-30行,平均10行。
每天一次,我完全更新表中的数据。
delete from tbl;
insert into tbl
select * from tbl_2;
commit;
型
我面临的挑战是查询运行时间太长:大约2-3小时。这可能是因为索引。有没有一种方法可以加快数据更新,并允许用户在更新时查询tbl
。如果这很重要-更新过程在python Airflow中运行,查询来自python Web应用程序。
2条答案
按热度按时间vulvrdjw1#
生成表的副本:
字符串
然后,在该表上创建所有需要的索引。完成后,切换表:
型
很快的。
q0qdq0h22#
如果没有任何内容引用此表,则Laurenz'Indiana Jones-style golden idol swap应该足够了
字符串
这也会从表的先前版本中传输索引定义。
如果你是超级用户,并且想使用黑客解决方案,你可以在插入时禁用索引。如果表被其他对象引用,这可能很有用,因为你保留了原始表,而交换会丢失前一个表并用新表替换,所以所有引用都会中断,需要重新建立:
型
正如@JonSG所指出的,你可能想考虑一个刚刚刷新的materialized view,甚至是pg_ivm。