在大表上创建索引-postgresql 9.6

在大表上创建索引-postgresql 9.6,postgresql,indexing,Postgresql,Indexing,我试图在一个大表26G上创建一些常规索引,但这需要很多时间——超过2小时。每个索引大约需要11分钟 也许我错了,我应该集中精力改进从oracle\u fdw将数据加载到postgres所需的时间。我在本地的postgresql表select*和远程的oracle表select*中进行了大量插入,大约200G,这也需要很多时间 如果有一种方法可以改变其中一个参数来提高性能,我会很高兴听到这种方法。在26G上运行此查询需要两个小时 有没有办法改进这个操作?有没有办法通过改进硬件来改进此操作?我没有看

我试图在一个大表26G上创建一些常规索引,但这需要很多时间——超过2小时。每个索引大约需要11分钟

也许我错了,我应该集中精力改进从oracle\u fdw将数据加载到postgres所需的时间。我在本地的postgresql表select*和远程的oracle表select*中进行了大量插入,大约200G,这也需要很多时间

如果有一种方法可以改变其中一个参数来提高性能,我会很高兴听到这种方法。在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
对于并行顺序扫描,在后台,多个工作线程或CPU线程负责执行一个查询。我们可以很容易地设置并行顺序参数的值,使您的查询执行速度提高10倍


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

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

许多年前,我在Oracle上通过在不同的会话中同时开始构建多个索引来解决这个问题。这意味着对于创建的每批索引,每个块只有一次物理读取

缺点是需要更多的排序内存才能有效地执行此操作


可能值得一试。

同时创建索引-不是更快,而是低锁定和低中断。换句话说,它在后台创建索引吗?假设我使用了这个选项,如果我从我的表中选择,它在完成创建之前不会使用索引?我正在寻找一种可以加快创建速度的解决方案,因为我需要在SELECTS中使用这些索引。在数据库导入之前对数据进行外部排序将加快索引创建速度。如果您能够使用具有C语言环境和排序规则的数据库,则可以获得额外的加速。当你指预排序时,我会在oracle端执行排序,但按什么排序?你说的C语言环境和排序是什么意思?请参考这个链接,我无法对创建索引运行解释分析,所以我无法检查它是否并行运行…你可以通过增加参数max_parallel_workers_per_gather来检查性能。就像设置max_parallel_workers_per_gather=4一样,我将其设置为8,所以现在我在等待创建索引所需的时间。它没有改变任何东西。当我使用max_parallel_workers_per_gather=8时需要14分钟,当我将其设置为4时也需要14分钟。如果参数maintenance_work_mem仍然是默认值,请尝试修改它。我在一个包含sql的表上以循环方式运行,以创建索引。如果这是一个大事务的一部分,我如何在不同的会话中创建它们呢?我认为这是不可能的。您也不能同时运行多个并发索引生成。我建议运行一个测试,看看是否可以通过这种方式提高性能,不过,可以通过不同的psql连接同时尝试创建三个索引——如果需要33分钟,那么表上的磁盘读取可能不是性能瓶颈,如果它需要11分钟,那么它是100%的瓶颈。它可能介于两者之间,你会发现,花20分钟同时构建5个版本是最佳选择。我同时创建了3个索引。第一个需要16分钟,它是三列的索引。第二次在一个专栏上花了9.5分钟。第三个花了9.5分钟,是两列的索引。我想mybe应该使用alter table xx set UNLOCKED选项。关于索引的创建时间,你怎么看?还有一件事,我看到在创建索引的过程中,有很多从磁盘读取的内容。