[英]Creating indexes on big tables - postgresql 9.6
我正在尝试在一个大表 (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
对于并行顺序扫描,在后台多个工作线程或 CPU 线程负责执行单个查询。 我们可以轻松设置 Parallel Sequential 参数的值,可以将您的查询执行速度提高 10 倍。
使用 max_worker_processes 参数,在 PostgreSQL 9.6 中,您可以更改 Process Workers 参数值,默认值为 8。
创建 X 多个索引的一个问题是,如果表大小超过缓存大小,则无法避免对表执行 X 次物理读取。
许多年前,我在 Oracle 上通过在不同会话中同时开始构建多个索引来解决这个问题。 这意味着对于正在创建的每批索引,每个块只有一次物理读取。
缺点是您需要更多的排序内存才能有效地执行此操作。
可能值得一试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.