應用批量數據寫入最佳實踐
更新時間 2025-02-05 09:37:23
最近更新時間: 2025-02-05 09:37:23
分享文章
本頁介紹天翼云TeleDB數據庫的應用批量數據寫入最佳實踐。
首推使用copy批量寫入數據,JDBC等驅動也支持copy方式,如copyManager方法;其次推薦batch insert批量提交,或insert 多values方式,可以減少應用至CN、DN節點交互的網絡開銷;不推薦單條insert提交寫法,效率最差。
例如,在虛擬機上,模擬寫入200000行記錄測試結果,結果顯示:copy寫入是單條insert的2000倍以上。
表結構:
create table teledb(id int, info varchar(32), crt_time timestamp);
| 寫入方式 | 效率 | 耗時 | 語法示例 | 說明 |
|---|---|---|---|---|
| single insert | 最慢 | 438s | for (int i=0; i < total_row; i++){ String sql = String.format("insert into test values(%d, 'init', now())", i); stmt.executeUpdate(sql); } |
每插入一條數據需要提交一次,數據庫交互較多。 |
| batch insert | 較快 | 3.16s | for (int i = 0; i < total_row; i++) { stmt.setInt(1, i); stmt.setString(2, "test_prepared"); stmt.addBatch(); if (i % g_batch == 0) { stmt.executeBatch(); stmt.clearBatch(); } } |
批量插入類似于多值插入,減少了數據庫交互: insert into test values(1,'test'),(2,'test2') .... |
| copy insert | 最快 | 0.21s | for (int i=0; i < total_row; i++){ buf.append(i + delimiter+ "test" + delimiter + "2021-05-25" + "\r\n" ); } StringReader reader = new StringReader(buf.toString()); copyManager.copyIn("COPY public.test FROM STDIN WITH DELIMITER ';'", reader); |
copy 將插入的數據組合為二進制流,通過流的方式導入表。走 copy 協議,數據庫交互最少。 |