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

TLa*_*ama 2 delphi sqlite dml anydac firedac

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

我注意到TADParam有一个AsBlobs索引属性,所以我认为它可能是可能的,但我还没有尝试过这个,因为没有提及性能也没有示例显示这一点,因为索引属性的类型RawByteString不太适合我的需要.

我正在使用FireDAC并使用SQLite数据库(Params.BindMode = pbByNumber因此我使用INSERT多个本机SQLite VALUES).我的目标是尽可能快地存储大约10万条包含非常小的BLOB数据(每条记录大约1kB)的记录(以FireDAC的抽象成本计算).

Arn*_*hez 5

您的主要观点是您正在使用SQLIte3数据库.

使用SQLite3,Array DML由FireDAC"模拟".由于它是本地实例,而不是客户端 - 服务器实例,因此无需准备一堆行,然后立即发送它们以避免网络延迟(如Oracle或MS SQL).

使用Array DML 可以加快SQLite3的插入过程,但我怀疑它会非常高.带有每个数字绑定的良好普通INSERT可以正常工作.

关于你的表现的主要技巧将是:

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

SQlite3非常适合BLOB流程.

从我的测试来看,FireDAC的插入时间非常好,非常接近SQlite3的直接访问.由于Delphi TDataSet类的开销,只有读取比直接SQLite3链接慢.