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

时间:2013-10-03 08:35:38

标签: sqlite delphi 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的抽象成本计算)。

1 个答案:

答案 0 :(得分:5)

您的主要观点是您使用的是SQLIte3数据库。

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

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

有关您案件表现的主要提示是:

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

SQlite3非常适合BLOB流程。

From my tests,FireDAC插入时序非常好,非常接近直接SQlite3访问。由于Delphi TDataSet类的开销,只有读取比直接SQLite3链接慢。