Postgresql

動態生成批量導入數據

  • March 7, 2020

我需要執行一個測試,我必須在 PostgreSQL(和 TimescaleDB)數據庫中模擬 20 年的歷史數據。我的問題是我必須生成**.sql文件並在目標數據庫中攝取它們(使用psql-client )。**

我們做了一些計算,結果是我們的數據庫在我們的表中將有2610億行20 年,因此每年包含13.05B數據。

對於每一行,我們都有一個時間戳(整數類型),我認為,為了更有效,我在我的 .sql 文件中寫入了10.000 個元素的事務。 為了使生成的**.sql文件在磁​​盤空間中變小(我在 python 中生成這些文件),我將每個文件限制為20M 行**。

所以我認為我可以在 bash 文件中動態生成這些文件,並且當生成文件時,我執行 psql 命令將其攝取到數據庫中,但問題是我不知道如何處理它:攝取過程比生成 .sql 文件需要更多時間,所以在 bash 命令中,恐怕我的 bash 腳本會等待攝取過程,然後再開始生成新的 .sql 文件並再次執行攝取過程。

總而言之,我嘗試創建一個攝取過程偽批處理,其中將刪除已成功攝取的每個生成的 .sql 文件,以避免佔用過多的磁碟空間。

如何避免在開始其他 .sql 文件生成之前等待攝取過程然後啟動攝取過程的事實?

這是出於開發目的,我想要攝取的這些數據與我們想要在生產模式下創建的數據接近。目前的目標是在 PostgreSQL 和 TimescaleDB 中執行讀取請求並比較這些請求。

實際的攝取速率將基於 RAID 後面保存數據文件和日誌文件的主軸(物理硬碟)的數量。

一個體面的 RAID 設置應該讓您能夠實現~1 M rows/sec或更高。

您的算法是另一個主要瓶頸。

方法一

create file您可以通過讓 Python 直接連接到數據庫來跳過該步驟。

我不知道是否有適用於 Python 的 Timescale DB 驅動程序。

對於速度:

  • 使用 BIND 變數
  • 記憶體您的語句句柄
  • 如果驅動程序支持它,請使用 BIND Arrays。

確保“每個 BIND 數組的行數”和“COMMIT 之間的組數”是程序中的變數。你會想玩這些來找到the sweet spot你的系統。那就是:您將需要執行benchmarks以找到適合您的設置的最佳值。

本例insert_vendor_list中使用該技術BIND Array

方法二

有時,您想在數據生成之前對其進行審查。在這種情況下,您想要創建一個.csv文件,而不是一個.sql充滿INSERT語句的文件。這些INSERT語句中的每一個都需要進行硬解析。

我使用過的 RDBMS 數據庫帶有專門的應用程序,可以以(或接近)最大速率(由您的 RAID 設置定義)攝取 CSV。

速度性能注意事項

根據您實際測試的內容,您應該在攝取數據之前禁用/刪除目標表上的所有索引和約束。然後,之後創建它們。

引用自:https://dba.stackexchange.com/questions/220874