分而治之,並着手消除。
首先,爲您的查詢添加一個LIMIT,因此需要10分鐘而不是17個小時,這將使嘗試不同的事情變得容易很多。
進程是否在不同的機器上運行?如果是這樣,測量網絡帶寬利用率,以確保它不是瓶頸。傳輸一個巨大的文件,確保帶寬真的在那裏。
進程是否在同一臺機器上運行?也許一個人正在餓着另一個IO。源和目標是相同的硬盤驅動器?不同的硬盤?固態硬盤?您需要解釋...
檢查兩個進程的IO和CPU使用情況。一個CPU核心處理最大嗎?
是否有一個進程最大限度地使用其中一個磁盤?檢查iowait,iops,IO帶寬等。
多少列?兩個INT,500 FLOAT,或者每行有12兆字節PDF的巨大BLOB?這些情況下的性能會有所不同...
現在,我將假設問題出現在POSTGRES一側。
創建一個虛擬表,等同於你的目標表,其中有:
- 完全相同的列(CREATE TABLE啞如表)
- 沒有索引,沒有任何限制(我認爲這是默認的,再次檢查創建的表)
- BEFORE INSERT觸發器,它返回NULL並刪除行。
行將被處理,只是沒有插入。
現在快嗎?好的,所以問題在於插入。
再次執行此操作,但是這次使用UNLOGGED TABLE(或TEMPORARY TABLE)。它們沒有任何防撞功能,因爲它們不使用日誌,但是對於導入數據來說它沒問題....如果它在插入過程中崩潰,那麼無論如何你都要擦除它並重新啓動。
還沒有索引,沒有限制。它快嗎?
如果緩慢=> IO寫入帶寬問題,可能是由其他東西撞擊磁盤造成的 如果fast => IO正常,則還未發現問題!
隨着表加載數據,逐個添加索引和約束,找出是否有,比如說,使用慢SQL函數的CHECK,或者FK到沒有索引的表中,那種東東。只需檢查創建約束需要多長時間。
注意:對於像這樣的導入,您通常會在導入後添加索引和約束。
我的直覺是,由於配置中檢查點設置太低,PG由於數據量龐大而像瘋了似的檢查點。或者像這樣的問題,可能隨機IO寫入相關。你把WAL放在一個快速的SSD上吧?
謝謝@AlainD 我已經檢查過所有這些點,除了最後一個。 我已經將內存設置爲6GB,並且在運行pentaho的過程中,永遠不會佔用6 GB。 查詢是一個簡單的select *,需要一段時間,但我認爲這不是瓶頸。 Commitsize設置爲100.000行。我一直在測試10.000,5.000和100.000乃至500.000,而更好的性能是100.000。 最後一點可以是關鍵? – Maik
你一定會破解spoon.bat(spoon.sh)來增加JVM的內存大小嗎?你也有 – AlainD
是的。我已經看到,spoon.sh已被修改,並確保我甚至添加了一個environtment變量,其中的內存變量名稱爲spoon.sh,設置爲6GB。 – Maik