用集算器更新數據庫的技巧

對數據庫進行批量更新時,使用update函數要比execute函數性能更好。算法

好比,source和target是兩個不一樣的數據源,callrecordA是source中的物理表,有1萬條記錄,callrecordB是target中的物理表,無記錄,如今須要將callrecordA中的數據同步到callrecordB中。sql

當使用execute函數進行批量更新,能夠發現性能不夠理想,代碼以下:數據庫

image.png

上述算法實際是循環執行insert語句,並無充分利用JDBC的批量更新機制,所以性能較差。並且上述算法只是插入數據,若是既有插入又有修改,處理起來會麻煩許多。oracle

使用update函數後,能夠看到性能提高明顯,代碼以下:函數

image.png

函數update利用JDBC的executeBatch機制進行批量更新,所以性能較好。選項@i表示只需生成insert語句,@u表示只生成update語句。無選項時表示既有insert又有update,即目標表已有數據,需比對源表和目標表的主鍵,若是某主鍵在源表存在,在目標表不存在,則生成insert語句,若是某主鍵在源表和目標表都存在,則生成update語句。工具

數據庫一般會提供同步/導入工具,這些工具一般具有更好的性能,也都支持命令行調用。SPL可執行命令行,所以能夠調用這些工具。好比用oracle的sqlldr導入數據,可以使用以下代碼:性能

image.png

A1-A3:將source中的表導出成文本文件,分隔符爲|。文本文件若是已存在,則可省略本步驟。spa

A4:執行命令行,調用sqlldr,命令格式要符合sqlldr的官方要求。注意callrecordB.ctl 是sqlldr要求的控制文件,格式以下:命令行

image.png

SPL支持並行計算,包括並行執行同步/導入工具,因此能夠將單文本拆成多個文本,同時導入多個文件,以此得到更高性能。不一樣的同步/導入工具,有不一樣的並行要求,一般的要求是不鎖表,且無惟一索引。好比並行執行sqlldr,可用以下代碼:3d

image.png

相關文章
相關標籤/搜索