動態生成批量導入數據
我需要執行一個測試,我必須在 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。
速度性能注意事項
根據您實際測試的內容,您應該在攝取數據之前禁用/刪除目標表上的所有索引和約束。然後,之後創建它們。