​

 

SDE的性能取决于:

首先操作系统的性能;其次是Oracle的性能,再次是SDE的性能。


第一:操作系统,无非是内存、CPU、带宽等。

可以有待提高的地方:第一、硬件升级;


第二、磁盘速度,用RAID集中存储会比服务器硬盘速度快。

第三、做LB,负载均衡。比如可以用OrcleRAC。

第二:Oracle的性能

Oracle可以调优的地方就太多了,有时数据库服务器本身硬件很好,但是oracle的参数设置不够好,Oracle也不能很好地发挥服务器的硬件性能。


我本身对Oracle只是入门水平,也就简单地给点建议:

2.1、OS的参数设置

内核参数名 说明

bufpages 对buffer空间不按静态分配,采用动态分配,使bufpages值随nbuf一起对buffer空间进行动态分配。

create_fastlinks 对HFS文件系统允许快速符号链接,

dbc_max_pct 加大最大动态buffer空间所占物理内存的百分比,以满足应用系统的读写命中率的需要。

dbc_min_pct 设置最小动态buffer空间所占物理内存的百分比

desfree 提高开始交换操作的最低空闲内存下限,保障系统的稳定性,防止出现不可预见的系统崩溃(Crash)。

fs_async 允许进行磁盘异步操作,提高CPU和磁盘的利用率

lotsfree 提高系统解除换页操作的空闲内存的上限值,保证应用程序有足够的可用内存空间。

maxdsiz 针对系统数据量大的特点,加大最大数据段的大小,保证应用的需要。(32位)

Maxdsiz_64bit maximum process datasegment size for 64_bit

Maxssiz 加大最大堆栈段的大小。(32_bit)

maxssiz_64bit 加大最大堆栈段的大小(64_bit)

Maxtsiz 提高最大代码段大小,满足应用要求

maxtsiz_64bit 原值过大,应调小

Minfree 提高停止交换操作的自由内存的上限

Shmem 允许进行内存共享,以提高内存的利用率。

Shmmax 设置最大共享内存段的大小,完全满足目前的需要。

Timeslice 由于系统的瓶颈主要反映在磁盘I/O上,因此 降低时间片的大小,一方面可避免因磁盘I/O不畅造成CPU的等待,从而提高了CPU的综合利用率。另一方面减少了进程的阻塞量。

unlockable_mem 提高了不可锁内存的大小,使可用于换页和交换的内存空间扩大,用以满足系统对内存管理的要求。


2.2、Oracle的竞争

让我们来回顾一下设置对象存储参数的一些常见规则:

?A、经常将pctused设置为可以接收一条新行。对于不能接受一行的free blocks对于我们来说是没有用的。如果这样做,将会令Oracle的性能变慢,因为Oracle将在扩展表来得到一个空的块之前,企图读取5个"dead"的freeblock。

?B、表格中chained rows的出现意味着pctfree太低或者是db_block_size太少。在很多情况下,RAW和LONG RAW列都很巨大,以至超过了Oracle的最大块的大小,这时chainedrows是不可以避免的。

?C、如果一个表有同时插入的SQL语句,那么它需要有同时删除的语句。运行单一个一个清除的工作将会把全部的空闲块放到一个freelist中,而没有其它包含有任何空闲块的freelists出现。

?D、freelist参数应该设置为表格同时更新的最大值。例如,如果在任何时候,某个表最多有20个用户执行插入的操作,那么该表的参数应该设置为freelists=20。

应记住的是freelist groups参数的值只是对于Oracle Parallel Server和Real ApplicationClusters才是有用的。对于这类Oracle,freelist groups应该设置为访问该表格的Oracle ParallelServer实例的数目。

2.3、其他常用参数


1)、包括SGA区(系统全局区):系统全局区(SGA)是一个分配给Oracle 的包含一个 Oracle 实例的数据库的控制信息内存段。

主要包括数据库高速缓存(the database buffer cache),

重演日志缓存(the redo log buffer),

共享池(the shared pool),

数据字典缓存(the data dictionary cache)以及其它各方面的信息

2)、db_block_buffers(数据高速缓冲区)访问过的数据都放在这一片内存区域,该参数越大,Oracle在内存中找到相同数据的可能性就越大,也即加快了查询速度。

3)、share_pool_size (SQL共享缓冲池):该参数是库高速缓存和数据字典的高速缓存。

4)、Log_buffer (重演日志缓冲区)

5)、sort_area_size(排序区)

6)、processes (同时连接的进程数)

7)、db_block_size (数据库块大小):Oracle默认块为2KB,太小了,因为如果我们有一个8KB的数据,则2KB块的数据库要读4次盘,才能读完,而8KB块的数据库只要1次就读完了,大大减少了I/O操作。数据库安装完成后,就不能再改变db_block_size的值了,只能重新建立数据库并且建库时,要选择手工安装数据库。

8)、open_links (同时打开的链接数)

9)、dml_locks

10)、open_cursors (打开光标数)

11)、dbwr_io_slaves (后台写进程数)



第三 就是SDE的性能


3.1、ESRI要求安装SDE for Oracle时的一些推荐参数设置。


?A、Control files

对于Oracle来说至少需要有三份Control Files。分布在物理分离的磁盘上。

?B、Redo logs

ESRI要求Oracle数据库至少有3份redo logs。ESRI 建议不要使用 NONARCHIVELOG作为默认的log类别.

?C、SYSTEM tablespace

把system表空间存储在一个低-中等活动的磁盘上。不要用System表空间作为数据存储空间,

同时也不要用SDE表空间存储空间数据。

?D、Undo tablespace

对于多版本地理数据库来说,需要增大undo_pool的大小;或者新建一个独立的roolback tablespace。

?E、Temp tablespace

把temp空间和一些高IO的表空间放在一起。


3.2、数据文件位置

A、 redo log 文件 -- 独立的磁盘

B、 undo tablespace 与redo log 文件分离 频繁的操作

C、 system tablespace 中-低 IO操作,与其他高IO的文件放置在一起.

D、 按照预定的IO程度,放置ArcSDE的Table 和INDEX表空间.

E、 Spatial Index Table 根本不读取table 只读取Index.


3.3、创建SDE过程中的参数


1. 设置oracle的db_block_size为 16kb;

2. 创建业务表的存储表空间,和index的存储表空间,注意 一定一定 要分离 index表空间 和 table 表空间到不同的物理磁盘上;

3. 修改dbtune.sde参数;

4. SDE 用户的的log文件,如果设置sessionlogpoolsize大于0的话,就会创建sde的log 文件。

5. 设置oracle的memory

首先 内存不能swap ;

其次 SGA不能超过RAM的2/3 .High degree of paging 是GPA过大的结果;

6. Swap space (Virtual Memory)

Swap space至少是3-4倍于RAM.

7. Redo log buffer

如果cpu少于4个,则设置512kb*cpu个数,否则设置128kb*cpu个数


测试:Select name,value from v$sysstat where name in(‘redoentries’,’redo log space requests’) 如果比值大于1:5000 则需要增加redolog buffer 的数值.

? Shared pool

一般设置16Mb 可以适应大多数的应用。esri 推荐设置成128MB 或 200MB.

? Buffer cache

SGA_memory = RAM *0.66

Buffer_cache = (SGA_memory-(share_pool size +log_buffer size))*0.9

Db_block_buffer = Buffer_cache/ Db_block_size;

Esri 推荐至少是16kb

? 设置PGA空间

设置 workarea_size_policy =auto

Pga_aggregate_target = RAM *0.16

? 如果数据库服务器只运行一个instance 设置 pre_sage_pga=true;

? 可选择:安装oracle startup trigger

$SDEHOME/tools/oracle arcsde_database_startup.sql 清除由于系统

? 创建ArcSDE数据库时一定要用OLTP 模板,不能使用数据仓库模板。


8、更新 sde featrue class 的stastistics


在catalog 中 右键 analyze 分析 图层;

Command line :

Sdetable –o update_dbms_stats – t –m compute –u–p



3.4、Dbtune.sde 的参数


默认情况下 index表空间 与table表空间相同。

修改的话,直接修改,再导入即可。

如 对于一个 feature class 的存储参数为:


B_STORAGE "PCTFREE 0 INITRANS 4"

# TABLESPACE<default business table tablespace name>



修改成

B_STORAGE "PCTFREE 0 INITRANS 4"

TABLESPACEndextablespace


对于一个 feature class 来说,导入ArcSDE数据库后,会产生3个table 和 7个index。至于这些表的结构和日后的使用,我在这里不做太多介绍。但是对于图象显示来讲,S表的大小起到了至关重要的作用。

3.4、空间索引的重建


我们知道SDE存储空间图形的方式为,Binery方式直接存储。

这样对于一个 S 表,里面以feature ID 为序列,存储着构成这个Feature ID 的所有切割图形。


这里面涉及到的一个问题就是 这个所谓的(Grid Size )切割比例,到底用多大的比例来切割存储才能达到最好的数据库效果。


先简单说明一下,这个分隔比例的影响:

如果分隔比例过大,如5000*5000,则一快图象中会存储着多个记录。

缺点1:这样以记录为序的S表,会存储着许多的冗余信息。因为每一个Feature Class均存储了这个图象。

缺点2:在desktop 之类客户端软件访问数据库时,有时只需要显示一条记录(放大到记录),此时ArcSDE必须把一个大的图形读取出来,再按照该记录的大小进行裁减。也消耗性能。


如果分隔比例过小,如50*50 则同一个feature class中的记录会有很多个图象组成。

缺点1:分隔比例小,导致每个记录均由多个图象组成,大大增加了数据库存储的记录数,增大了存储空间。

缺点2:分隔比例小,在显示一个记录时,需要读取多条记录,再拼接在一起进行显示。



综上所讲,无论过大,或者过小 都会影响存储和性能。


在使用ArcCatalog或者SDE 命令行导入数据时,ArcCatalog 或SDE会自动计算出一个合适的分隔存储比例。这个默认的比例一般情况下会比较合适,但因为ArcSDE支持三级分隔比例。如果只使用一个默认的分隔比例,ArcSDE性能不会最佳。

在以下的情况下,会产生问题:

A、feature class 中的所有记录大小不一致时。B、大范围的记录时(如河流、道路、边框)

首先,如果记录大小不一,计算出来的分隔比例总是不能达到最优。

另外,对于大范围的记录,默认分隔比例过小。会导致 Feature Class is read-only mode 。图层不再可读。


通过ArcCatalog可以修改Grid Size 的大小。


在《arcsde configuration guide for oracle 》 中详细介绍了 grid size的设置和调整。另外,

《The Role of Grid Size Optimization in ArcSDE Performance Tuning》

 



完。


ps。说起来简单,做起来很难。我做过的尝试有:

1、由RAID代替服务器硬盘;

2、设置LDAP、dbblock-size 等esri推荐的oracle参数;

3、分离table 和index 表空间;

4、重新设置grid size。


另外,如果使用ArcIMS的话,可以用application server 集群和 多spatial server 来提高性能


你们的评论、反馈,及对你们有所用,是我整理材料和博文写作的最大的鼓励和唯一动力。欢迎讨论和关注!

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。