时间:2021-07-01 10:21:17 帮助过:1人阅读
2014-03-14 09:20?2686人阅读?评论(6)?收藏?举报
?分类:
? ?
ArcSDE(193)??ArcGIS Engine(30)??ST_Geometry(30)??Oracle(106)??性能优化(53)?
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
很多用户经常会有将数据写入ArcSDE地理数据库的操作,也时常会写入效率而烦恼,它们渴望不管多大多复杂的数据,尽可能的使用较少的时间写入到ArcSDE中,而往往用户写入ArcSDE也通过依赖于本身的业务需求,使用自定义的代码开发就非常常见了,那影响ArcSDE写入效率的因素就比较多了。
----------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
Blog: ? ? ? ? ? ? ? http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
代码因素
大多数用户可能还在使用ArcGIS Engine、空间SQL、ArcSDE API和WebAPI进行开发,针对后两者我不是很熟悉,也没有什么发言权,所以更多的以前面两种开发模式为例,看看在代码开发过程中是否有可以优化的余地。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ArcGIS Engine ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
以下部分可以参考2011年Esri中国开发者大会《Geodatabase高效编程_李圣虎》,特此感谢!
该文档建议ArcGIS Engine的开发者仔细学习,里面介绍了很多提高效率的技巧和细节!
http://wenku.baidu.com/link?url=mgCFXh23Q3fbRaBjOJr-LN1b24_pbH_UylNcTt1zZ_hNROqByNzj8nRpV4IZrKulMYod9jxiOOeN8WGRgx0Y0Z_vLvEAZsjw2KSz2Uj0w0K
?
另外大家也可以参考:Geodatabase API best practices?
http://resources.arcgis.com/en/help/arcobjects-net/conceptualhelp/index.html#//000100000047000000
?
1:使用多线程
说实话,ArcGIS Engine是否支持多线程,大家的理解是不一样的。用资深人士解释就是ArcGIS Engine支持多线程,但是不支持多个线程之间的彼此调用。
下面就以更新多个要素类的字段来演示一下多线程的使用方法,以下都是伪代码。
编写一个更新要素类的函数,输入参数为要素类名称
编写多线程函数,调用这个更新要素类的函数
?
2:使用游标进行地理数据库编辑
如果是批量进行数据编辑,不建议用户使用传统的Create Feature+Store的方法,而是使用insertCursor或者Update Cursor的方法。
? ? ? 测试场景:从本地File Geodatabase中读取数据,向ArcSDE Geodatabase要素类中插入读取的数据;
?
?
?
数据情况:简单的线要素类,2721089条记录;
?
?
?
测试环境:硬件(T9600 CPU 4G内存)软件(Windows 7 64Bit Oracle 11g ArcGIS 10)
?
?
?
备注:测试结果中时间单位为秒
?
3:游标
游标分为类绑定游标: SearchCursor、UpdateCursor、InsertCursor和非类绑定游标:QueryDef Cursor。在使用游标使用过程中经常会遇到如下情况
如果选择TRUE,说明使用资源回收游标,但是下一个游标还指向同一个内存地址,如果是FALSE,说明资源回收游标和内存地址,下一个游标还需要重新分配一个新的内存地址,这样无疑增加了服务器资源的开销,所以没有特殊需求,建议使用TRUE。
?
关于游标的相关提示:
查询游标(Search Cursor)
更新游标(Update Cursor)
插入游标(Insert Cursor)
QueryDef 游标
4:资源回收
尽可能使用Esri提供的MangeLifetime来管理ArcGIS Engine对象的生命周期,系统会自动进行维护,而不需要在使用类似以下方式进行释放资源了。(由于版本原因,可能有所不同)
?ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(o);
System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
GC.Collect();
?
5:如果可能化,使用缓存来提高效率
?
更多了解:http://resources.arcgis.com/en/help/arcobjects-net/componenthelp/index.html#//002500000831000000
?
6:如果可能的话,尽可能的使用GP工具来代替开发
ArcGIS Desktop的性能无疑是最优化的,而且最大的好处就是实现了用户可以使用的ArcToolbox工具,而且ArcGIS Engine也可以进行调用,比如将一个File Geodatabase导入到ArcSDE 地理数据库中,用户就可以直接使用Copy_Feature工具进行操作。
?
7:是否必须使用版本化编辑
ArcGIS不仅支持版本编辑,也支持非版本编辑,所以并不是所有情况必须使用版本化编辑,大家都知道注册版本后编辑一段时间会导致效率低下,但是有些用户在一开始接触ArcGIS编辑时只知道必须注册版本才能编辑,但是它的业务情况可能并不需要必须注册版本,比如只是编辑一下属性字段值等情况,所以这个时候可能选择非版本编辑效率更高。
IDatasetEdit
?
更多参考:http://resources.arcgis.com/en/help/arcobjects-net/componenthelp/index.html#/IDatasetEdit_Interface/00250000015m000000/
?
用户也可以查看《Geodatabase高效编程_李圣虎》总结的常见开发错误,都是一些比较典型的可能导致效率的案例。
?
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 空间SQL ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
对空间SQL的开发其实就是用户的SQL语句的基本功是否扎实。
1:SQL语句语法和效率
????在SQL中,索引是提高查询效率的必要条件,尤其是WHERE子句的查询字段必须要创建索引才能提高查询效率,如果没有WHERE条件在查询中使用了MIN、MAX、COUNT函数的字段也需要创建索引。还有很多情况用户尽管创建了索引对象但效率依然低下,这是因为有些SQL运算符是会将索引失效的。
?
????在WHERE中使用不等于条件,将会使索引失效。
?
????在WHERE子句中使用IS NULL或者IS NOT NULL同样会限制索引的使用。如果被索引的列在某些行中存在NULL值,在索引列中就不会有相应的条目。(例外:位图索引对于NULL列也会进行记录,因此位图索引对于NULL搜索通常较为快速)。
?
????如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。一些常见的函数:TRUNC、SUBSTR、TO_DATE、TO_CHAR、INSTR等,都可能会使索引失效。
?
????这个是比较难于发现的问题。ORACLE不会对不匹配的数据类型报错,ORACLE会隐式地把VARCHAR2列的数据类型转换成要被比较的数值型数据类型。
?
如果是使用ST_geometry函数的话,还需要注意对ST_Geometry函数的使用
具体可以参考:
http://blog.csdn.net/linghe301/article/category/797871
?
2:尽可能的使用存储过程
如果可能的话,尽可能的使用存储过程来代替原始的单个SQL语句,这里面就不再解释存储过程的好处了。
?
3:使用绑定变量而不是传入固定的值
?
?
----------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
Blog: ? ? ? ? ? ? ? http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 网络因素? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
网络的原因也是用户需要注意的,如果你的网络带宽、延迟都有问题,肯定会影响数据传输的效率的。这里我只是指出这是一个影响因素,因为不专业,所以不去更多的分析这个问题,但是用户需要留意该问题。
----------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
Blog: ? ? ? ? ? ? ? http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------
?
? ? ? ? ? ? ? ? ? ArcSDE地理数据库因素(以Oracle为例) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
1:空间索引问题
在ArcSDE地理数据库编辑过程中,系统会自动维护该编辑要素对象的空间索引,那么就会耗费一定的服务器资源,特别是在大数据量进行数据插入的过程中,无需进行空间索引的创建,可以等批量插入完成之后,统一创建空间索引,这样无疑就提高了操作效率。
ArcGIS Desktop、ArcToolbox、ArcSDE命令行、Python都提供了管理空间索引的方法,当然ArcGIS Engine也提供了管理空间索引的接口
?
IFeatureClassLoad.LoadOnlyMode
?
2:如果进行更新操作,就需要留意索引
用户进行更新,需要先查询出需要更新的要素对象,那么不管是通过属性索引或者空间索引进行查询,都需要这些索引对象有效。
而且在编辑完毕之后,还需要对这些索引对象重新创建,保证新编辑对象的索引更新。
?
3:数据库归档日志关闭
如果是大数据量插入操作,如果没