关于sqlite:执行包含BLOB数据的Array DML命令是否可能且有意义?

Is it possible and meaningful to execute an Array DML command containing BLOB data?

是否可以执行在参数数组中传递BLOB字段数据的Array DML INSERTUPDATE语句?我的问题最重要的部分是,如果可能的话,包含BLOB数据的Array DML命令是否仍然比一一执行命令更有效?

我注意到TADParam具有AsBlobs索引属性,因此我认为这是可能的,但是我还没有尝试过,因为没有提及性能,也没有示例显示此内容,并且因为索引属性是键入RawByteString不太适合我的需求。

我正在使用FireDAC并使用SQLite数据库(Params.BindMode = pbByNumber,所以我正在使用具有多个VALUES的本机SQLite INSERT)。我的目标是尽可能快地存储约100k条包含很小的BLOB数据(每条记录约1kB)的记录(以FireDAC的抽象成本为准)。


本例的主要要点是您正在使用SQLIte3数据库。

对于SQLIte3,FireDAC将"模拟"阵列DML。由于它是本地实例,而不是客户端-服务器实例,因此无需准备一堆行,然后立即发送它们以避免网络延迟(与Oracle或MS SQL一样)。

使用数组DML可以通过SQLite3稍微加快您的插入过程,但是我怀疑它会非常高。良好的普通INSERT绑定每个数字将正常工作。

与您的情况相关的主要提示为:

  • 将您的流程嵌套在一个事务中(或者更好的是,每1000行数据使用一个事务);
  • 准备一个INSERT语句,然后每次使用绑定的参数重新执行它;
  • 默认情况下,FireDAC使用最快的选项(例如,禁用LOCK)来初始化SQLite3,所以就这样吧。

SQlite3非常适合BLOB进程。

根据我的测试,FireDAC的插入时间相当不错,非常接近直接SQlite3访问。由于Delphi TDataSet类的开销,因此仅读取比直接SQLite3链接慢。