【问题标题】:Creating indexes on big tables - postgresql 9.6在大表上创建索引 - postgresql 9.6
【发布时间】:2018-01-18 07:00:18
【问题描述】:

我正在尝试在一个大表 (26G) 上创建一些常规索引,但这需要很长时间 - 超过 2 小时。每个索引大约需要 11 分钟。

也许我错了,我应该专注于缩短从 oracle (oracle_fdw) 将数据加载到 postgres 所需的时间。我对local_postgresql_table select * from remote_oracle_table(大约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

【问题讨论】:

  • CREATE INDEX CONCURRENTLY - 不是更快,但低锁定和低中断
  • 也就是说它在后台创建索引?假设我使用了这个选项,如果我从我的表中选择它不会使用索引,直到它完成创建?我正在寻找一种可以加快创建速度的解决方案,因为我需要在我的选择中使用这些索引
  • 在导入数据库之前在外部对数据进行预排序将使索引创建更快。如果您负担得起使用具有 C 语言环境和排序规则的数据库,则可以得到额外的加速。
  • 我通过 oracle_fdw 从 oracle 数据库中获取数据。当您的意思是预排序时,我将在 oracle 端进行排序,但按什么排序? C 语言环境和排序规则是什么意思?

标签: postgresql indexing


【解决方案1】:

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

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

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

可能值得一试。

【讨论】:

  • 我在一个包含用于创建索引的 sql 的表上循环运行。如果它是大交易的一部分,我如何才能在不同的会话中准确地创建它们?
  • 我认为这是不可能的。您也不能同时运行多个concurrently 索引构建。我建议运行测试是否可以通过这种方式提高性能,但是,通过不同的 psql 连接同时尝试创建三个索引 - 如果需要 33 分钟,那么表上的磁盘读取可能不是性能瓶颈,如果需要 11 分钟,那么它就是 100% 的瓶颈。它可能介于两者之间,你会发现像 5 个同时构建需要 20 分钟是最佳选择。
  • 我同时创建了 3 个索引。第一个花了 16 分钟,它是三列的索引。第二个在一根柱子上花了 9.5 分钟。第三个耗时 9.5 分钟,它是两列的索引。
  • 我想 mybe 使用 alter table xx set unlogged 选项。关于索引的创建时间你怎么看?
  • 还有一件事,我看到在创建索引的过程中从磁盘读取了很多数据。
【解决方案2】:

Visit this blog for the Example of Parallel Query Processing:

对于并行顺序扫描,在后台多个工作线程或 CPU 线程负责执行单个查询。我们可以轻松设置 Parallel Sequential 参数的值,让您的查询执行速度提高 10 倍。

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

【讨论】:

  • 我无法在创建索引上运行解释分析,所以我无法检查它是否并行运行...
  • 您可以通过增加参数 max_parallel_workers_per_gather 来检查性能。比如设置 max_parallel_workers_per_gather = 4
  • 我将它设置为 8,所以现在我正在等待查看创建索引需要多少时间。
  • 它没有改变任何东西。当我设置 max_parallel_workers_per_gather=8 时需要 14 分钟,当我将其设置为 4 时也需要 14 分钟。
  • 如果参数maintenance_work_mem还是默认的话,试试修改一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多