2013-10-03 18 views
2

是否有可能執行一個數組DML INSERTUPDATE語句傳遞BLOB字段數據的參數陣列中?我的問題中更重要的部分,如果可能的話,包含BLOB數據的Array DML命令仍然比逐個執行命令更有效率?執行包含BLOB數據的Array DML命令是否可行並且有意義?

我注意到,TADParamAsBlobs索引屬性,所以我認爲這是可能的,但因爲沒有業績也不如提出這一點,我沒有嘗試這樣做還因爲索引屬性是RawByteString類型的這並不太適合我的需求。我使用FireDAC並使用SQLite數據庫(Params.BindMode = pbByNumber,所以我使用本機SQLite INSERT與多個VALUES)。我的目標是儘可能快地存儲包含非常小的BLOB數據(大約1kB /記錄)的大約100k條記錄(以FireDAC抽象的代價)。

回答

5

你的情況,主要的一點是,您使用的是SQLIte3數據庫。

SQLite3隨着,DML陣列由FireDAC 「仿真」。由於它是一個本地實例,而不是客戶端 - 服務器實例,因此不需要準備一堆行,然後立即發送它們以避免網絡延遲(如使用Oracle或MS SQL)。

使用Array DML 可能加快你的插入過程有點SQLite3,但我懷疑它會非常高。良好的普通插入與每個數字的綁定將工作得很好。

關於你的情況表現的主要祕訣是:

  • 巢您的過程在一個事務中(甚至更好,每1000行數據,使用一個交易);
  • 準備一個INSERT語句,然後每次用bound參數重新執行它;
  • 默認情況下,FireDAC以最快的選項初始化SQLite3(例如,禁用LOCK),所以放手吧。

SQLITE3約爲BLOB的過程非常好。

From my tests,FireDAC插入時間是相當不錯的,非常接近直接訪問SQLITE3。由於Delphi TDataSet類的開銷,只有讀取比直接的SQLite3鏈接慢。

相關問題