首页 / 浏览问题 / 组件GIS / 问题详情
批量删除操作非常慢
4EXP 2020年09月06日

使用sqlserver空间数据库引擎,对cad记录集进行批量删除,非常慢,慢的不可思议。

public void removeDwg(Long id) {

              DatasetVector dtv = (DatasetVector) ds.getDatasets().get(DTV_WGS84);

              QueryParameter qp = new QueryParameter();

              qp.setAttributeFilter(FLD_FID + "=" + id);

              qp.setCursorType(CursorType.DYNAMIC);

              qp.setHasGeometry(false);

              qp.setResultFields(new String[] { "SmID", FLD_FID});

              Recordset rs = dtv.query(qp);

              rs.getBatch().begin();     // 开启批量处理

              rs.deleteAll();

              rs.getBatch().update();

              rs.dispose();

       }

sqlserver: 2014

cad数据集数据量:56693

iobjects java版本:官方10.0.1

如果打开了batch操作,速度会快很多:

delete supermap record: 70687                     // 开启批量删除

delete supermap record: 570176             // 未开启批量

但即便开启批量操作,也要70秒时间,实在不理解,为什么要这么长时间,对于数据库来说,执行删除操作是很快的操作

DELETE FROM SMDTV_7 where FID = 45

> Affected rows: 56693

> Time: 3.1s

SQL语句3.1秒就能完成,为啥组件批量操作需要70s?20几倍的性能差距,难不成组件是一条一条删除的? 

需要测试cad数据,请联系我索取。

1个回答

你好,批量更新处理默认最大提交数是1024,您可以在rs.getBatch().begin()之前调用 rs.getBatch().setMaxRecordCount(int value);  进行适当调整。
2,842EXP 2020年09月07日
removeAll 为啥是一条一条删除?这本身就不合理,recordset中包含查询语句,直接执行sql语句性能远高于一条一条操作,,你再怎么调节参数也没法弥补这么大的性能差异,20多倍,你们有测试过这样的性能差异吗?其二,改参数没有很好的可操作性,这跟后台数据库也有关系,如果只是根据数据量判断,那研发完全可以根据数据库引擎特性动态调整参数,对吗?

以下测试,我换到了一台i9工作站上:
delete supermap record: 7768   // 默认1024条
delete supermap record: 6012   // MaxRecordCount = 10000条

可以看到这个参数的设置并没有决定性的影响。

直接执行sql:

DELETE FROM SMDTV_1 where FID = 10161
> Affected rows: 56693
> Time: 1.077s

高性能主机上依然有6倍的性能差异。而之前虚拟机上的表现更是夸张,20倍。还不能引起你们的重视?
...