数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

ADO.Net实现Oracle大批量数据的更新优化


发布日期:2023年06月21日
 
ADO.Net实现Oracle大批量数据的更新优化

在日常的业务系统应用中大家经常会使用到大量数据的的提交(包括查询更新或删除)假如目标数据库的数据量较大一次需要处理的操作较多就会出现系统执行效率低下等问题文本中笔者以Oraclei数据库为例通过对ADONet中的数据库支持的应用实践说明几种常见的优化处理方法并对比其中的优劣

为了更详细说明情况笔者以某业务数据填报功能为例假设有个用户每周需要填报某统计数量填报明细的数据量约为有专门的填报页面实现一次提交这样一周的数据增量约为一年为多万要保证系统有效运行年以上需要考虑数据存储(增改)效率问题(数据库本身的优化配置包括表空间索引等查询效率已经考虑不在此讨论范畴)这类业务的特点是数据操作量较大但执行的指令复杂度较低包含简单的新增修改删除

传统处理方法存在的问题

对每一个要处理的操作直接对目标表执行对应的SQL操作(或存储过程)可使用ADONet的参数化SQL或通过DataSet与DataAdapter来间接处理这样每个用户批量提交数据时需要执行大约次SQL操作虽然数据库进行了优化单次执行SQL的效率并不低但由于一次执行的指令较多随着目标数据容量的增加效率会逐步降低最终不可忍受

优化方法临时表处理模式

对于大规模的目标数据库表进行多次修改删除或更新操作效率必定较慢要降低对目标表的操作次数可以采用临时表的解决办法具体方法为建立一个与目标表结构类似的临时表(由于B/S模式的特点临时表是基于事务的而不是基于连接的)并增加操作模式标记字段在执行操作前将本次要操作的数据就是某个用户每周的数据(约条左右第一次处理时应该没有数据)一次查询转入临时表再对临时表执行修改更新删除(作删除标记)操作处理完毕后分别将临时表的数据分三类提交到目标表流程如下图所示

删除

Delete From TARGET_TABLE Where KEY In(Select KEY

From TEMP_TABLE Where STATE=Delete

新增

Insert Into TARGET_TABLE …

Select … From TEMP_TABLE Where STATE=Insert

修改

Update TARGET_TABLE Set …

Where KEY=TEMP_TABLEKET AND TEMP_TABLESTATE=Update

实验证明万数据量的条件下此方法能比传统的方法快倍左右且执行效率受目标数据库容量的影响较小

优化方法使用SQL批处理

SQL批处理一般有种模式一种是将要执行的SQL语句连接形成批处理指令一次提交到服务器执行一种是对执行的SQL指令传递多组参数批执行这两种方法都需要数据库及ADONet的支持

SystemDataOracleClient 的ADONet 版本支持第一种方式的的批处理如通过DataAdapter对DataSet的批量数据提交时系统会根据数据集合中的新增修改删除标识构造批处理指令形成SQL指令段提交服务器执行这种方式是将多个SQL指令形成一组SQL指令的方法实现多个指令的批执行能一定程度提高功能的执行效率原理如下所示

Begin

Insert Into TAREGT_TABLE(ABC) Values(

Insert Into TAREGT_TABLE(ABC) Values(

Insert Into TAREGT_TABLE(ABC) Values(

……

Insert Into TAREGT_TABLE(ABC) Values(nn+n+

end

此方法形成的批处理SQL指令及参数会随着数据量的增加而成倍增加数据更新量与执行效率受到限制而微软的Oracle ADONet实现并没有将批处理方法直接对外公开只能通过DataSet的数据批量更新间接使用

另一种处理方法是使用Oracle的ADONet实现OracleDataAccessClient实现的ADONet支持第二种模式的批处理指令其利用Oracle数据库自带的批处理功能通过设定OracleCommand的ArrayBindCount来实现对参数数组的传递当ArrayBindCount设置为大于传递给一个OracleCommand的参数不再是参数值而是参数数组这样一条Command指令就可以执行多个处理插入条数据使用这种方法利用了数据库本身对批量数据操作的优化机制极大提高了数据操作效率通过对目标数据库容量为万的目标表测试发现此方法执行比传统方法的执行效率提高倍以上在测试过程中发现万的目标数据量的情况下一次插入万条数据只需要秒左右且操作效率受目标数据量的影响较小

总结

通过以上的分析我们可以得出以下结论采用临时表的方法及批处理的手段都能较好解决大规模数据量模式下的批量数据提交的问题其中Oracle的ADONet的实现效率最高处理最简单微软ADONet的实现没有完全利用数据库本身的功能功能及效率受到局限而临时表的处理方法编程比较复杂适合于在使用微软的ADONet的情况下使用更进一步Oracle存储过程支持参数数组的传递也可以采用通过传递参数数组的存储过程来实现前提也是必须采用Oracle的ADONet实现因为微软的ADONet实现不支持参数数组传递而Oracle数据库也支持Bulk Insert功能如果有批量的数据需要插入可以考虑使用此方法此处不详细讨论

这种方法将对目标数据库表的次SQL操作转化为对临时表的数据库操作由于临时表数据量少效率较高且周期稳定而最后的数据更新只涉及到临时表到目标表的有限的次SQL操作不涉及到ADONet与数据库的数据交互效率相对较高

上一篇:oracle里的trunc函数

下一篇:小议Oracle11g的自治事务(四)