目录
IDatasetEdit
IFeatureClassLoad.LoadOnlyMode
首页 数据库 mysql教程 怎么提高ArcSDE for Oracle写入地理数据库的效率

怎么提高ArcSDE for Oracle写入地理数据库的效率

Jun 07, 2016 pm 03:50 PM
for oracle 写入 怎么 提高

很多用户经常会有将数据写入ArcSDE地理数据库的操作,也时常会写入效率而烦恼,它们渴望不管多大多复杂的数据,尽可能的使用较少的时间写入到ArcSDE中,而往往用户写入ArcSDE也通过依赖于本身的业务需求,使用自定义的代码开发就非常常见了,那影响ArcSDE写

很多用户经常会有将数据写入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支持多线程,但是不支持多个线程之间的彼此调用。

下面就以更新多个要素类的字段来演示一下多线程的使用方法,以下都是伪代码。

编写一个更新要素类的函数,输入参数为要素类名称

 public class VersionEditing
    {
        /// <summary>
        /// 更新要素类指定字段值
        /// </summary>
        /// <param name="parameter">要素类名称
        public void UpdateFiledValue(object parameter)
        {
		........
        }
      }
登录后复制
编写多线程函数,调用这个更新要素类的函数
private void MultiThreadEditing()
        {
            VersionEditing VersionEditing = new GIS.VersionEditing();
            //声明线程对象
            Thread thA = new Thread(new ParameterizedThreadStart(VersionEditing.UpdateFiledValue));
            Thread thB = new Thread(new ParameterizedThreadStart(VersionEditing.UpdateFiledValue));
            //设置线程工作模型
            thA.SetApartmentState(ApartmentState.STA);
            thB.SetApartmentState(ApartmentState.STA);
            //启动线程
            thA.Start("featureclass1");
            thA.Start("featureclass2");
        }
登录后复制

2:使用游标进行地理数据库编辑

如果是批量进行数据编辑,不建议用户使用传统的Create Feature+Store的方法,而是使用insertCursor或者Update Cursor的方法。

//建议的方法
public static void InsertFeaturesUsingCursor(IFeatureClass featureClass, List  geometryList)
{
    using(ComReleaser comReleaser = new ComReleaser())
    {
        // Create a feature buffer.
        IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
        comReleaser.ManageLifetime(featureBuffer);

        // Create an insert cursor.
        IFeatureCursor insertCursor = featureClass.Insert(true);
        comReleaser.ManageLifetime(insertCursor);

        // All of the features to be created are classified as Primary Highways.
        int typeFieldIndex = featureClass.FindField("TYPE");
        featureBuffer.set_Value(typeFieldIndex, "Primary Highway");
        foreach (IGeometry geometry in geometryList)
        {
            // Set the feature buffer's shape and insert it.
            featureBuffer.Shape = geometry;
            insertCursor.InsertFeature(featureBuffer);
        }

        // Flush the buffer to the geodatabase.
        insertCursor.Flush();
    }
}
登录后复制

      测试场景:从本地File Geodatabase中读取数据,向ArcSDE Geodatabase要素类中插入读取的数据;
      数据情况:简单的线要素类,2721089条记录;
      测试环境:硬件(T9600 CPU 4G内存)软件(Windows 7 64Bit Oracle 11g ArcGIS 10)
      备注:测试结果中时间单位为秒

怎么提高ArcSDE for Oracle写入地理数据库的效率


3:游标

游标分为类绑定游标: SearchCursor、UpdateCursor、InsertCursor和非类绑定游标:QueryDef Cursor。在使用游标使用过程中经常会遇到如下情况

Public Void test()
{                
		workspaceEdit.StartEditOperation();
                IQueryFilter queryFilter = new QueryFilter();
                queryFilter.WhereClause = clause;
                //是否重复绑定游标
                ICursor updateCursor = table.Update(queryFilter, true);
                comReleaser.ManageLifetime(updateCursor);
                int fieldIndex = table.Fields.FindField("FWMC");
                IRow temp = null;
                while ((temp = updateCursor.NextRow()) != null)
                {
                    temp.set_Value(fieldIndex, "aaaa");
                    updateCursor.UpdateRow(temp);
                }
                workspaceEdit.StopEditOperation();
}
登录后复制

如果选择TRUE,说明使用资源回收游标,但是下一个游标还指向同一个内存地址,如果是FALSE,说明资源回收游标和内存地址,下一个游标还需要重新分配一个新的内存地址,这样无疑增加了服务器资源的开销,所以没有特殊需求,建议使用TRUE。


关于游标的相关提示:

查询游标(Search Cursor)

  • 在编辑会话中初始化SearchCursor可能导致缓存记录提交到数据库(触发DBMS写操作)
  • 通过SearchCursor获得的行支持Store和Delete操作
更新游标(Update Cursor)
  • 必须使用UpdateCursor提供的的UpdateRow和DeleteRow方法对通过UpdateCursor获得的行进行更新和删除操作
  • UpdateCursor提供的UpdateRow方法只能针对通过UpdateCursor获得的当前行进行操作
  • UpdateCursor不支持跨编辑操作使用,打开一个新的编辑操作时必须初始化一个新的更新游标
  • 使用UpdateCursor对复杂要类类进行更新时必须处于一个编辑会话中
插入游标(Insert Cursor)
  • 主要用于批量要素插入
  • 使用缓存,定时调用Flush将缓存写入数据库,调用InsertRow和Flush方法时要捕捉异常
  • 使用InsertCursor时关闭空间缓存
QueryDef 游标
  • 不能针对通过QueryDef Cursor获得的行进行Store和Delete操作
  • 在编辑会话中使用QueryDef Cursor会导致缓存提交到数据库

4:资源回收

尽可能使用Esri提供的MangeLifetime来管理ArcGIS Engine对象的生命周期,系统会自动进行维护,而不需要在使用类似以下方式进行释放资源了。(由于版本原因,可能有所不同)

 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(o);
登录后复制
<span>System.Runtime.InteropServices.Marshal.ReleaseComObject(o);</span>
登录后复制
<span>GC.Collect();</span>
登录后复制


5:如果可能化,使用缓存来提高效率

/// <summary>
        /// 执行空间缓存
        /// </summary>
        /// <param name="pFWS">工作空间
        /// <param name="pEnv">缓存区域
        private void SpatialCache(IFeatureWorkspace pFWS, IEnvelope pEnv)
        {
            if (m_pWS != null)
            {
                ISpatialCacheManager3 pSCM = m_pWS as ISpatialCacheManager3;
                if (!pSCM.CacheIsFull)
                {
                    pSCM.FillCache(pEnv);
                }

                //执行空间操作代码

                //清空缓存

                pSCM.EmptyCache();
              
            }
        }
登录后复制

更多了解: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编辑时只知道必须注册版本才能编辑,但是它的业务情况可能并不需要必须注册版本,比如只是编辑一下属性字段值等情况,所以这个时候可能选择非版本编辑效率更高。

<h1 id="IDatasetEdit">IDatasetEdit</h1>
登录后复制

更多参考: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中使用不等于条件,将会使索引失效。


  • 使用 IS NULL或IS NOT NULL

在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:数据库归档日志关闭

如果是大数据量插入操作,如果没有特殊要求,可以将Oracle的归档日志进行关闭,因为归档日志主要记录数据的更高,特别是数据的修改和删除,对数据新增操作其实无需打开数据库归档,如果打开,系统会在批量新增数据的同时,写入大量的归档日志信息,也无疑也会降低编辑效率。


4:禁用表空间日志

虽然数据库的归档日志禁用之后,只是说数据库不再产生具体的归档日志文件,但是还需要进行非归档的循环日志写入,那么如果完全禁用日志的生成,需要禁用操作用户的表空间日志,这样在插入数据之后,系统就会记录比较少的日志信息。


启用日志(Logging):用户进行表创建、索引创建、分区以及后续插入等操作产生REDO日志,作为数据恢复的依据。

禁用日志(No Logging):以上相关操作不会产生REDO日志,进而也不能进行数据恢复,但是数据加载效率会大幅度提高。



注意:这些操作是用户进行大数据量新增条件下,而且具有Oracle数据库知识的用户操作。


操作示例:


1:禁用归档日志

sqlplus / as sysdba

shutdown immediate;

startup mount;

alter database flashback off;

alter database noarchivelog;

alter database open;

select flashback_on from v$database;

archive log list;


2:禁用表空间日志

sqlplus /nolog

connect / as sysdba;

select 'ALTER TABLESPACE ' || CHR(34) || NAME || CHR(34) || 'NOLOGGING;'

FROM V$TABLESPACE

WHERE NAME NOT IN ('SYSTEM','SYSAUX','USERS','TEMP','UNDOTBS1')ORDER BY NAME;

 

ALTER TABLESPACE "PM_BDATA" NOLOGGING;

ALTER TABLESPACE "PM_BINDEX" NOLOGGING;

ALTER TABLESPACE "PM_BDATA_TOPO" NOLOGGING;


3:当用户只需完毕之后,在进行表空间日志启用和归档日志的启用即可。


4:启用表空间日志

sqlplus /nolog

connect / as sysdba;

select 'ALTER TABLESPACE ' || CHR(34) || NAME || CHR(34) || 'LOGGING;'

FROM V$TABLESPACE

WHERE NAME NOT IN ('SYSTEM','SYSAUX','USERS','TEMP','UNDOTBS1')ORDER BY NAME;

ALTER TABLESPACE "PM_BDATA" LOGGING;

ALTER TABLESPACE "PM_BINDEX" LOGGING;

ALTER TABLESPACE "PM_BDATA_TOPO" LOGGING;


5:启用归档日志

sqlplus / as sysdba

alter system set db_recovery_file_dest_size=10G scope=spfile;

alter system setdb_recovery_file_dest='C:\oradata\flash_recovery_area' scope=spfile;

alter system setlog_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile;

shutdown immediate;

startup mount;

alter database archivelog;

alter database flashback on;

alter database open;

select flashback_on from v$database;

archive log list;


5:版本编辑的状态压缩

这个问题我就不再赘述了,该博客无数次提及这个问题,感兴趣的用户可以在本博客搜索“版本压缩”或者“Compress”。


6:Oracle参数

比如足够大的SGA和PGA,典型Oracle参数的设置如Open_Cusors、db_writer_processes等


7:其他因素

当然,如果用户的硬件环境足够好,比如数据与索引分开存储、分区表、RAC架构等也会为批量写入数据提高效率。

注意;严格禁止用户在OLTP环境下使用Oracle的并行计算,因为这样会严重造成资源占用问题。



----------------------------------------------------------------------------------


Blog:               http://blog.csdn.net/linghe301

----------------------------------------------------------------------------------


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

oracle数据库日志会保存多久 oracle数据库日志会保存多久 May 10, 2024 am 03:27 AM

Oracle 数据库日志的保留期限取决于日志类型和配置,包括:重做日志:由 "LOG_ARCHIVE_DEST" 参数配置的最大大小决定。归档重做日志:由 "DB_RECOVERY_FILE_DEST_SIZE" 参数配置的最大大小决定。在线重做日志:不归档,在数据库重启时丢失,保留期限与实例运行时间一致。审计日志:由 "AUDIT_TRAIL" 参数配置,默认保留 30 天。

oracle数据库启动步骤顺序为 oracle数据库启动步骤顺序为 May 10, 2024 am 01:48 AM

Oracle 数据库启动顺序为:1. 检查前置条件;2. 启动监听器;3. 启动数据库实例;4. 等待数据库打开;5. 连接到数据库;6. 验证数据库状态;7. 启用服务(如果需要);8. 测试连接。

oracle需要多少内存 oracle需要多少内存 May 10, 2024 am 04:12 AM

Oracle 所需内存量取决于数据库大小、活动水平和所需性能水平:用于存储数据缓冲区、索引缓冲区、执行 SQL 语句和管理数据字典缓存。具体数量受数据库大小、活动水平和所需性能水平影响。最佳实践包括设置适当的 SGA 大小、调整 SGA 组件大小、使用 AMM 和监控内存使用情况。

oracle中某个字符出现的次数怎么看出来 oracle中某个字符出现的次数怎么看出来 May 09, 2024 pm 09:33 PM

要在 Oracle 中查找字符出现的次数,执行以下步骤:获取字符串的总长度;获取字符所在子字符串的长度;计算字符出现的次数:用总长度减去子字符串长度。

oracle数据库服务器硬件配置要求 oracle数据库服务器硬件配置要求 May 10, 2024 am 04:00 AM

Oracle 数据库服务器硬件配置要求:处理器:多核,主频至少 2.5 GHz,大型数据库建议 32 核以上。内存:小型数据库至少 8GB,中等规模 16-64GB,大型数据库或高负载工作负载高达 512GB 或更多。存储:SSD 或 NVMe 磁盘,RAID 阵列提高冗余和性能。网络:高速网络(10GbE 或更高),专用网卡,低延迟网络。其他:稳定电源、冗余组件、兼容操作系统和软件、散热和冷却系统。

oracle怎么读取dbf文件 oracle怎么读取dbf文件 May 10, 2024 am 01:27 AM

Oracle 可以通过以下步骤读取 dbf 文件:创建外部表,引用 dbf 文件;查询外部表,检索数据;将数据导入 Oracle 表。

如何辨别耐克鞋子的真假鞋盒(掌握一招轻松识别) 如何辨别耐克鞋子的真假鞋盒(掌握一招轻松识别) Sep 02, 2024 pm 04:11 PM

耐克作为全球知名的运动品牌,其鞋子备受瞩目。然而,市场上也存在大量的假冒伪劣商品,其中就包括假冒的耐克鞋盒。辨别真假鞋盒对于保护消费者的权益至关重要。本文将为您提供一些简单而有效的方法,以帮助您辨别真假鞋盒。一:外包装标题通过观察耐克鞋盒的外包装,可以发现许多细微的差异。真正的耐克鞋盒通常具有高品质的纸质材料,手感光滑,且没有明显的刺激性气味。正品鞋盒上的字体和标志通常清晰、精细,并且没有模糊或颜色不协调的情况。二:LOGO烫金标题耐克鞋盒上的LOGO通常是烫金工艺,真品鞋盒上的烫金部分会呈现出

用oracle数据库需要多大内存 用oracle数据库需要多大内存 May 10, 2024 am 03:42 AM

Oracle 数据库所需内存量取决于数据库大小、工作负载类型和并发用户数量。通常建议:小型数据库:16-32 GB,中型数据库:32-64 GB,大型数据库:64 GB 或更多。其他需考虑因素包括数据库版本、内存优化选项、虚拟化和最佳实践(监视内存使用情况、调整分配)。

See all articles