SDE+ORACLE优化配置

时间:2022-09-20 21:02:31

原文 SDE+ORACLE优化配置

 

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》
http://gis.esri.com/library/userconf/proc05/papers/pap1858.pdf
也会有所帮助。



完。

ps。说起来简单,做起来很难。我做过的尝试有:
1、由RAID代替服务器硬盘;
2、设置LDAP、dbblock-size 等esri推荐的oracle参数;
3、分离table 和index 表空间;
4、重新设置grid size。

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