阵列DML命令(FireDAC)的性能

来自RAD Studio
跳转到:航行,搜索

转到使用命令(FireDAC)


本文介绍了FireDAC支持的Array DML功能的高性能。第一篇文章将引导您通过一个简单的示例,演示如何通过编写几行代码每秒插入数千条记录。

介绍

FireDAC封装了阵列DML命令并允许您对所有服务器类型使用相同的代码。最终的性能将因服务器实现的不同而不同。主要是Oracle、Microsoft SQL Server和IBM DB2对Array DML有非常强大的支持,因此性能的提高是显而易见的。

我们建议您使用示例代码来了解应用程序和网络中潜在的性能提高。

如何准备测试环境

以下示例适用于FireDAC示例数据库环境。有关此数据库安装的更多详细信息,请查看FireDAC演示数据库。您可以在示例目录中找到演示项目:

  • 本教程中使用的代码:FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\AD03-ArrayDML。
  • 基本代码示例:FireDAC\Samples\Comp Layer\TFDQuery\ExecSQL\Batch。

数组DML命令的主要元素

假设有一个“用例”,您必须INSERT、UPDATE、DELETE或运行任何其他参数化命令N次,通常每个记录一个命令。这意味着每组输入参数都请求执行SQL命令,并在客户端和服务器之间单独传输,这将导致网络、客户端和服务器上的负载过重。

数组DML允许您在一次传输中不仅传输一组数据,而且传输N组数据。请参见以下示例:

FD查询1.SQL语言.文本:= '插入ADQA_Batch_test(tint,tstring)值(:f1,:f2)';

通过使用Array DML命令,可以显著提高代码的速度。这样的命令不仅传递一组参数,而且传递N组参数。

FD查询1.参数.阵列大小 := 100;
...
对于  := 0  FD查询1.参数.阵列大小  开始
  FD查询1.参数[0].作为整数[] := ;
  FD查询1.参数[1].AsStrings(作为字符串)[] := “测试” + IntToStr公司();
结束;
FD查询1.执行(FD查询1.参数.阵列大小);

这个参数查询的属性不再是一维数组,而是二维数组,允许您在将N组参数值发送到服务器之前存储它们。

有关更多详细信息,请参阅阵列DML参考章节。

使用提示

  • 可用于任何使用参数(INSERT、UPDATE、DELETE…)的SQL命令。
  • 错误处理在记录级别上得到支持,并在单独的文章中进行了描述。
  • FireDAC统一了不同服务器类型的Array DML(无需深入研究API)。

阵列DML测试运行的典型结果

附加的测试代码允许您在特定环境中进行实验。

阵列DML测试图片.png

根据主机和网络性能的不同,测试示例的结果可能会有很大差异。在一台相当旧的笔记本电脑上显示的本地Oracle的典型图片仍将每秒显示超过10万条记录,如您在此屏幕截图中所示:

数组DMLTestResults.png

更大的Array DML ArraySize会带来更高的性能(在我们的示例中,高达2000倍)。

AD03结果.png

性能提示

阵列DML命令性能受以下因素的影响:

  • 它们在慢速网络上的速度明显更快,因为这些命令创建的TCP/IP包更少。
  • 它们减少了客户端的CPU负载,因为服务器大部分时间都必须处理数组命令。
  • 由于服务器通常必须评估触发器和索引,因此通常不会达到大于10万rec/sec的理论速度。
  • 对于非常大的批插入(例如,>1’000'000条记录),您应该考虑删除并重新创建非主键索引,以达到最佳性能。


另请参见