首页 / 浏览问题 / 组件GIS / 问题详情
使用C++组件查询遍历postgis数据库100万数据很慢,超图桌面端很快
ygr
11EXP 2022年04月24日

使用产品:iobjectcpp 操作系统:win10 x64
数据类型: postgis 和spatialite
问题详细描述:使用iobjectcpp 查询遍历postgis数据库100万条数据(需要30s),而使用超图桌面端打开同一张表性能诊断显示只用了1秒.spatialite数据库自己代码与性能诊断时间相近,都没建索引


 UGGeometry * tempGeometry= nullptr;
	  
	 begin = clock();
	 uGRecordset->MoveFirst();

//---------------------------------------------
//spatialite 使用该方式遍历,postgis用这种方式慢需要30s
	 while (!uGRecordset->IsEOF()) {
		 uGRecordset->GetGeometry(tempGeometry);
		 delete tempGeometry;
		 tempGeometry = nullptr;
		 uGRecordset->MoveNext(); 
	 }


	 end = clock();

1个回答

您好,请问您的需求具体是什么?是要使用 SuperMap iObjects C++ 组件和 postgis 数据库吗?SuperMap iObjects .NET 组件和 SuperMap iDesktop 桌面端方面做了一些读取数据时的性能优化,iDesktop 桌面端是基于 iObjects .NET 组件开发的,所以连接 PostGIS 数据库时,性能比 iObjects C++ 快是正常情况。

希望可以帮到您。
2,258EXP 2022年04月24日
您好,我就是想测下读写性能,我想问下同样C++代码,同样数据量spatialite数据库只用一秒而在postgis特别慢需要30s,而桌面端读取都是不到一秒,不应该差距这么大吧.或者我应该怎么优化提升遍历性能

您好,这个与数据库的本身有关系,而且您也没有创建索引,性能慢的情况是比较常见的。

性能优化的话有以下几种方式可供您参考:

  1. 建立索引(字段索引、空间索引);
  2. 分库分表;
  3. 增大数据库缓存大小,修改数据库相关参数(可以参数postgis数据库性能优化PostgreSQL 查询性能调优

希望可以帮到您。

感谢您从数据库表方向给出的优化建议,我还是有疑问,同样的postgis数据库,同一张表,同样数据量,没建立索引等情况下,桌面端1s不到,我用SuperMap iObjects C++ 组件 c++的方式,用了30s,我从代码方向还有什么可以优化的吗,或者我用的方式哪里有问题吗

您好,代码方面的话建议您可以考虑以下方式:

  1. 通过 BuildFieldIndex 和 BuildSpatialIndex 方法建立字段索引和空间索引;
  2. 在不使用 Geometry 的时候,可以不用遍历全部记录;
  3. 尝试手动分页方式,按块的模式分次进行读取(如:每次读取1000条记录等);
  4. 按需读取,每次仅读取展示(计算)范围内的数据;
...