在大表上创建索引 - postgresql 9.6

时间:2017-08-10 07:08:10

标签: postgresql indexing

我试图在一张大桌子(26G)上创建一些常规索引但是需要很多时间 - 超过2小时。每个指数大约需要11分钟。

Mybe我错了,我应该集中精力改善从oracle(oracle_fdw)将数据加载到postgresql所需的时间。我从remote_oracle_table(约200G)预先形成很多插入到local_postgresql_table select *。它还需要很多时间,如果有办法改变其中一个参数以提高性能,我将很乐意听到。在26G上运行此查询需要两个小时。

有没有办法改善这项行动?有没有办法通过改进硬件来改善这种操作(我没有看到服务器过载..)

我配置的参数:

min_parallel_relation_size = 200MB
max_parallel_workers_per_gather = 5 
max_worker_processes = 8 
effective_cache_size = 2500MB
work_mem = 16MB
maintenance_work_mem = 1500MB
shared_buffers = 1500MB
RAM : 5G

谢谢,Mariel。

2 个答案:

答案 0 :(得分:-1)

Visit this blog for the Example of Parallel Query Processing:

对于并行顺序扫描,在后台,多个worker或CPU线程负责执行一个查询。我们可以轻松设置Parallel Sequential参数的值,可以快10倍地执行查询。

使用max_worker_processes参数,在PostgreSQL 9.6中,您可以更改Process Workers参数值,默认为8。

答案 1 :(得分:-1)

创建X多个索引的一个问题是,如果表大小超过了缓存大小,则无法避免对表执行X物理读取。

很多年前,我通过在同一时间开始在不同会话中构建多个索引来解决这个问题。这意味着每个块的物理读取只对每个正在创建的索引进行读取。

缺点是你需要更多的排序记忆才能有效地做到这一点。

可能值得一试。