雖然sqoop的匯出功能符合需要, 但速度太慢。每一行都插入到單獨的insert語句中,是否有方法將多個insert語句一起批處理?
sqoop 為各種資料庫和用例量身定做, 為每次插入多行提供多個選項。
首先, 可以使用--batch引數啟用 jdbc 批處理:
sqoop export \
--connect jdbc:mysql: \
--username sqoop \
--password sqoop \
--table cities \
--export-dir cities \
--batch
弊端:可能資料不一致
第二個選項是使用屬性 sqoop.export.records.per.statement 指定將在每個 insert 語句中使用的記錄數:
sqoop export \
-dsqoop.export.records.per.statement=10 \
--connect jdbc:mysql: \
--username sqoop \
--password sqoop \
--table cities \
--export-dir cities
最後, 您可以設定將每個事務插入多少行通過 sqoop.export.statements.per.transaction 屬性:
sqoop export \
-dsqoop.export.statements.per.transaction=10 \
--connect jdbc:mysql: \
--username sqoop \
--password sqoop \
--table cities \
--export-dir cities
預設值可能因聯結器而異。對於 sqoop.export.records.per.statement 和 sqoop.export.statements.per.transaction 屬性,
sqoop 預設為禁用的批處理數100。
這些方法都從不同的角度來看, 可以結合認為合適的方式進行組合。讓我們仔細看看每種方法。
jdbc 介面公開了乙個 api, 用於在準備好的語句中使用多組值進行批處理。使用批處理引數, sqoop 可以利用這一點。此 api 存在於所有 jdbc 驅動程式中, 因為它是 jdbc 介面所必需的。實現可能因資料庫而異。有些資料庫驅動程式使用能夠在乙個請求內向遠端資料庫傳送多個行以獲得更好的效能, 而其他一些則可能只是單獨傳送每個查詢。某些驅動程式在批處理模式下執行時, 由於通過在內部快取中序列化行然後將其逐行傳送到資料庫伺服器而引入額外的開銷, 導致效能更差
第二種將多行批處理到同一查詢中的方法是在乙個單一 insert 語句內指定多個行。將屬性 sqoop.export.records.per.statement 設定為兩個或多個值時, sqoop 將建立以下查詢:
insert into table values (...), (...), (...), ...;
當查詢完全由 sqoop 生成時, jdbc 驅動程式不會更改它, 將其傳送到遠端資料庫。不幸的是, 並非所有資料庫都支援單個 insert 語句中的多行。像 mysql、oracle 和 postgresql 這樣的通用關聯式資料庫確實支援這一點, 但某些資料倉儲可能不支援。
在使用單個 insert 語句插入大量行時, 還需要記住另外乙個缺點: 大多數資料庫對最大查詢大小有限制。如果遠端資料庫伺服器不接受生成的查詢, 則 sqoop 匯出將失敗。
第三個批處理機制不會嘗試通過將多個行放在一起來實現更好的效能, 就像前兩個選項一樣。在 sqoop.export.statements.per.transaction 中指定的值決定了在提交事務和啟動新的資料庫之前, 將在資料上發布多少個 insert 語句。
此屬性的較高值將導致更長時間的事務, 並通過建立和完成事務來刪除所引入的開銷。使用更高的值通常有助於提高效能。但是, 確切的行為取決於基礎資料庫及其功能。如果資料庫需要特殊的表級寫鎖定以將行插入到表中, 則對每個事務的語句使用較高的值可能會導致效能顯著降低。
由於每個方法都使用不同的方式來提高匯出效能, 因此可以將它們全部合併在一起。每個資料庫系統和使用者環境是不同的。在所有用例中都沒有可以廣泛應用的最佳實踐。我們的建議是開始啟用-批量匯入, 並指定每條語句的行數大致等於允許的最大查詢大小。從這個出發點, 試驗不同的價值觀。
批量插入資料
drop procedure if exists pre 如果存在先刪除 delimiter 以delimiter來標記用 表示儲存過程結束 create procedure pre 建立pre 儲存方法 begin declare i int default 12 declare n int de...
JDBC批量插入資料
一.直接上源 以匯入課表資料為例 批量插入新申請 匯入預設課表 throws sqlexception catch sqlexception e int number ps.executebatch 把剩餘的資料插入 conn.commit 手動提交事務 try catch sqlexception...
TVP批量插入資料
錶值引數具有更高的靈活性,在某些情況下,可比臨時表或其他傳遞引數列表的方法提供更好的效能。錶值引數具有以下優勢 1 首次從客戶端填充資料時,不獲取鎖。2 提供簡單的程式設計模型。3 允許在單個例程中包括複雜的業務邏輯。4 減少到伺服器的往返。5 可以具有不同基數的表結構。6 是強型別。7 使客戶端可...