翻譯|使用教程|編輯:李爽夏|2019-02-14 09:34:56.000|閱讀 926 次
概述:本篇文章介紹了UniDAC的批處理操作 。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Universal Data Access Components (UniDAC)是一款通用數(shù)據(jù)庫訪問組件,提供了多個數(shù)據(jù)庫的直接訪問,如針對Windows的Delphi, C++Builder, Lazarus (以及 Free Pascal) , Mac OS X, iOS, Android, Linux和64和32位的FreeBSD等等。我們將長期的經(jīng)驗集于這個小組件,提供統(tǒng)一的數(shù)據(jù)庫連接訪問(如oracle、微軟SQL等等)。這意味著您可以在您的項目之間輕松地切換不同的數(shù)據(jù)庫,以及創(chuàng)建跨數(shù)據(jù)庫應(yīng)用程序接口。
現(xiàn)代數(shù)據(jù)庫處理的數(shù)據(jù)量穩(wěn)步增長。在這方面,存在一個嚴(yán)重的問題——數(shù)據(jù)庫性能。必須盡快執(zhí)行插入、更新和刪除操作。因此,Devart提供了幾種解決方案來加速處理大量數(shù)據(jù)。因此,例如,TUniLoader支持向數(shù)據(jù)庫插入大量數(shù)據(jù)。不幸的是,TUniLoader只允許插入數(shù)據(jù)——它不能用于更新和刪除數(shù)據(jù)。
新版本的Devart Delphi數(shù)據(jù)訪問組件引入了大數(shù)據(jù)處理的新機制-批處理操作。關(guān)鍵是只執(zhí)行一個參數(shù)化的修改SQL查詢。多個更改是由于這樣一個查詢的參數(shù)不是單個值,而是一個完整的值數(shù)組。這種方法極大地提高了數(shù)據(jù)操作的速度。此外,與使用TUniLoader相比,批處理操作不僅可以用于插入,還可以用于修改和刪除。
讓我們以包含最流行數(shù)據(jù)類型屬性的BATCH_TEST表為例,更好地了解批處理操作的功能。
For Oracle:
CREATE TABLE BATCH_TEST ( ID NUMBER(9,0), F_INTEGER NUMBER(9,0), F_FLOAT NUMBER(12,7), F_STRING VARCHAR2(250), F_DATE DATE, CONSTRAINT PK_BATCH_TEST PRIMARY KEY (ID) )
For MS SQL Server:
CREATE TABLE BATCH_TEST ( ID INT, F_INTEGER INT, F_FLOAT FLOAT, F_STRING VARCHAR(250), F_DATE DATETIME, CONSTRAINT PK_BATCH_TEST PRIMARY KEY (ID) )
For PostgreSQL:
CREATE TABLE BATCH_TEST ( ID INTEGER, F_INTEGER INTEGER, F_FLOAT DOUBLE PRECISION, F_STRING VARCHAR(250), F_DATE DATE, CONSTRAINT PK_BATCH_TEST PRIMARY KEY (ID) )
For InterBase:
CREATE TABLE BATCH_TEST ( ID INTEGER NOT NULL PRIMARY KEY, F_INTEGER INTEGER, F_FLOAT FLOAT, F_STRING VARCHAR(250), F_DATE DATE )
For MySQL:
CREATE TABLE BATCH_TEST ( ID INT, F_INTEGER INT, F_FLOAT FLOAT, F_STRING VARCHAR(250), F_DATE DATETIME, CONSTRAINT PK_BATCH_TEST PRIMARY KEY (ID) )
For SQLite:
CREATE TABLE BATCH_TEST ( ID INTEGER, F_INTEGER INTEGER, F_FLOAT FLOAT, F_STRING VARCHAR(250), F_DATE DATETIME, CONSTRAINT PK_BATCH_TEST PRIMARY KEY (ID) )
要將記錄插入到BATCH_TEST表中,我們使用以下SQL查詢:
INSERT INTO BATCH_TEST VALUES (:ID, :F_INTEGER, :F_FLOAT, :F_STRING, :F_DATE)
使用簡單插入操作時,查詢參數(shù)值如下:
查詢執(zhí)行后,一條記錄將插入到BATCH_TEST表中。
使用批處理操作時,查詢及其參數(shù)保持不變。但是,參數(shù)值將包含在一個數(shù)組中:
現(xiàn)在,在執(zhí)行查詢時,一次向表中插入5條記錄。
如何在代碼中實現(xiàn)批量操作?
讓我們嘗試使用批插入操作將1000行插入到BATCH_TEST表中:
var i: Integer; begin // describe the SQL query UniQuery1.SQL.Text := 'INSERT INTO BATCH_TEST VALUES (:ID, :F_INTEGER, :F_FLOAT, :F_STRING, :F_DATE)'; // define the parameter types passed to the query : UniQuery1.Params[0].DataType := ftInteger; UniQuery1.Params[1].DataType := ftInteger; UniQuery1.Params[2].DataType := ftFloat; UniQuery1.Params[3].DataType := ftString; UniQuery1.Params[4].DataType := ftDateTime; // specify the array dimension: UniQuery1.Params.ValueCount := 1000; // populate the array with parameter values: for i := 0 to UniQuery1.Params.ValueCount - 1 do begin UniQuery1.Params[0][i].AsInteger := i + 1; UniQuery1.Params[1][i].AsInteger := i + 2000 + 1; UniQuery1.Params[2][i].AsFloat := (i + 1) / 12; UniQuery1.Params[3][i].AsString := 'Values ' + IntToStr(i + 1); UniQuery1.Params[4][i].AsDateTime := Now; end; // insert 1000 rows into the BATCH_TEST table UniQuery1.Execute(1000); end;
此命令將使用準(zhǔn)備好的參數(shù)值數(shù)組,通過一個SQL查詢向表中插入1000行。還可以將另一個參數(shù)–偏移(默認(rèn)為0)–傳遞給方法。Offset參數(shù)指向數(shù)組元素,批處理操作從該元素開始。
我們可以通過兩種方式將1000條記錄插入到BATCH_TEST表中。
每次1000行:
UniQuery1.Execute(1000);
2×500行:
// insert first 500 rows UniQuery1.Execute(500, 0); // insert next 500 rows UniQuery1.Execute(500, 500);
500行,然后是300行,最后是200行:
// insert 500 rows UniQuery1.Execute(500, 0); // insert next 300 rows starting from 500 UniQuery1.Execute(300, 500); // insert next 200 rows starting from 800 UniQuery1.Execute(200, 800);
通過批處理操作,我們可以修改BATCH_TEST表中的所有1000行,這很簡單:
var i: Integer; begin // describe the SQL query UniQuery1.SQL.Text := 'UPDATE BATCH_TEST SET F_INTEGER=:F_INTEGER, F_FLOAT=:F_FLOAT, F_STRING=:F_STRING, F_DATE=:F_DATE WHERE ID=:OLDID'; // define parameter types passed to the query: UniQuery1.Params[0].DataType := ftInteger; UniQuery1.Params[1].DataType := ftFloat; UniQuery1.Params[2].DataType := ftString; UniQuery1.Params[3].DataType := ftDateTime; UniQuery1.Params[4].DataType := ftInteger; // specify the array dimension: UniQuery1.Params.ValueCount := 1000; // populate the array with parameter values: for i := 0 to 1000 - 1 do begin UniQuery1.Params[0][i].AsInteger := i - 2000 + 1; UniQuery1.Params[1][i].AsFloat := (i + 1) / 100; UniQuery1.Params[2][i].AsString := 'New Values ' + IntToStr(i + 1); UniQuery1.Params[3][i].AsDateTime := Now; UniQuery1.Params[4][i].AsInteger := i + 1; end; // update 1000 rows in the BATCH_TEST table UniQuery1.Execute(1000); end;
從BATCH_TEST表中刪除1000行的操作如下:
var i: Integer; begin // describe the SQL query UniQuery1.SQL.Text := 'DELETE FROM BATCH_TEST WHERE ID=:ID'; // define parameter types passed to the query: UniQuery1.Params[0].DataType := ftInteger; // specify the array dimension UniQuery1.Params.ValueCount := 1000; // populate the arrays with parameter values for i := 0 to 1000 - 1 do UniQuery1.Params[0][i].AsInteger := i + 1; // delete 1000 rows from the BATCH_TEST table UniQuery1.Execute(1000); end;
BATCH_TEST表示例允許使用數(shù)據(jù)庫和批處理操作分析正常操作的執(zhí)行速度:
需要注意的是,在不同的數(shù)據(jù)庫服務(wù)器上修改同一個表時,檢索到的結(jié)果可能會有所不同。這是由于操作執(zhí)行速度可能因特定服務(wù)器的設(shè)置、其當(dāng)前工作負(fù)載、吞吐量、網(wǎng)絡(luò)連接等而不同。
在填充數(shù)組和插入記錄時,我們通過索引訪問查詢參數(shù)。更明顯的是,按名稱訪問參數(shù):
for i := 0 to 9999 do begin UniQuery1.Params.ParamByName('ID')[i].AsInteger := i + 1; UniQuery1.Params.ParamByName('F_INTEGER')[i].AsInteger := i + 2000 + 1; UniQuery1.Params.ParamByName('F_FLOAT')[i].AsFloat := (i + 1) / 12; UniQuery1.Params.ParamByName('F_STRING')[i].AsString := 'Values ' + IntToStr(i + 1); UniQuery1.Params.ParamByName('F_DATE')[i].AsDateTime := Now; end;
但是,參數(shù)數(shù)組的填充速度會變慢,因為在每個循環(huán)迭代中,必須根據(jù)每個參數(shù)的名稱定義其序號。如果循環(huán)執(zhí)行10000次,性能損失可能會變得相當(dāng)嚴(yán)重。
購買UniDAC正版授權(quán),請點擊“”喲!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn