[英]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.