SDE+ORACLE优化配置.docx
《SDE+ORACLE优化配置.docx》由会员分享,可在线阅读,更多相关《SDE+ORACLE优化配置.docx(29页珍藏版)》请在冰点文库上搜索。
SDE+ORACLE优化配置
1、修改oracle系统参数
建库时选择手工建库,设置db_block_size=16k(一旦建库,无法修改)
altersystemsetsga_max_size=1640Mscope=spfile;(TotalphysicalRAM*80%*50%)
altersystemsetsga_target=1640Mscope=spfile;
altersystemsetpga_aggregate_target=650Mscope=spfile;(TotalphysicalRAM*80%*20%)
altersystemsetpre_page_sga=truescope=spfile;
altersystemsetshared_pool_size=128Mscope=spfile;
altersystemsetopen_cursors=2000scope=spfile;
altersystemsetsession_cached_cursors=50scope=spfile;
altersystemsetcursor_sharing=exactscope=spfile;
altersystemsetcursor_space_for_time=truescope=spfile;
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 maximumprocessdatasegmentsizefor64_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设置为可以接收一条新行。
对于不能接受一行的freeblocks对于我们来说是没有用的。
如果这样做,将会令Oracle的性能变慢,因为Oracle将在扩展表来得到一个空的块之前,企图读取5个"dead"的freeblock。
B、表格中chainedrows的出现意味着pctfree太低或者是db_block_size太少。
在很多情况下,RAW和LONGRAW列都很巨大,以至超过了Oracle的最大块的大小,这时chainedrows是不可以避免的。
C、如果一个表有同时插入的SQL语句,那么它需要有同时删除的语句。
运行单一个一个清除的工作将会把全部的空闲块放到一个freelist中,而没有其它包含有任何空闲块的freelists出现。
D、freelist参数应该设置为表格同时更新的最大值。
例如,如果在任何时候,某个表最多有20个用户执行插入的操作,那么该表的参数应该设置为freelists=20。
应记住的是freelistgroups参数的值只是对于OracleParallelServer和RealApplicationClusters才是有用的。
对于这类Oracle,freelistgroups应该设置为访问该表格的OracleParallelServer实例的数目。
2.3、其他常用参数
1)、包括SGA区(系统全局区):
系统全局区(SGA)是一个分配给Oracle的包含一个Oracle实例的数据库的控制信息内存段。
主要包括数据库高速缓存(thedatabasebuffercache),
重演日志缓存(theredologbuffer),
共享池(thesharedpool),
数据字典缓存(thedatadictionarycache)以及其它各方面的信息
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要求安装SDEforOracle时的一些推荐参数设置。
A、Controlfiles
对于Oracle来说至少需要有三份ControlFiles。
分布在物理分离的磁盘上。
B、Redologs
ESRI要求Oracle数据库至少有3份redologs。
ESRI建议不要使用NONARCHIVELOG作为默认的log类别.
C、SYSTEMtablespace
把system表空间存储在一个低-中等活动的磁盘上。
不要用System表空间作为数据存储空间,
同时也不要用SDE表空间存储空间数据。
D、Undotablespace
对于多版本地理数据库来说,需要增大undo_pool的大小;或者新建一个独立的roolbacktablespace。
E、Temptablespace
把temp空间和一些高IO的表空间放在一起。
3.2、数据文件位置
A、redolog文件 --独立的磁盘
B、undotablespace与redolog文件分离频繁的操作
C、systemtablespace中-低IO操作,与其他高IO的文件放置在一起.
D、按照预定的IO程度,放置ArcSDE的Table和INDEX表空间.
E、SpatialIndexTable根本不读取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.Highdegreeofpaging是GPA过大的结果;
6. Swapspace(VirtualMemory)
Swapspace至少是3-4倍于RAM.
7. Redologbuffer
如果cpu少于4个,则设置512kb*cpu个数,否则设置128kb*cpu个数
测试:
Selectname,valuefromv$sysstatwherenamein(‘redoentries’,’redologspacerequests’)如果比值大于1:
5000则需要增加redologbuffer的数值.
Sharedpool
一般设置16Mb可以适应大多数的应用。
esri推荐设置成128MB或200MB.
Buffercache
SGA_memory=RAM*0.66
Buffer_cache=(SGA_memory-(share_poolsize+log_buffersize))*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;
可选择:
安装oraclestartuptrigger
$SDEHOME/tools/oraclearcsde_database_startup.sql清除由于系统
创建ArcSDE数据库时一定要用OLTP模板,不能使用数据仓库模板。
8、更新sdefeatrueclass的stastistics
在catalog中右键analyze分析图层;
Commandline:
Sdetable–oupdate_dbms_stats–t–mcompute–u–p
3.4、Dbtune.sde的参数
默认情况下index表空间与table表空间相同。
修改的话,直接修改,再导入即可。
如对于一个featureclass的存储参数为:
B_STORAGE "PCTFREE0INITRANS4"
# TABLESPACE
修改成
B_STORAGE "PCTFREE0INITRANS4"
TABLESPACE ndextablespace
对于一个featureclass来说,导入ArcSDE数据库后,会产生3个table和7个index。
至于这些表的结构和日后的使用,我在这里不做太多介绍。
但是对于图象显示来讲,S表的大小起到了至关重要的作用。
3.4、空间索引的重建
我们知道SDE存储空间图形的方式为,Binery方式直接存储。
这样对于一个S表,里面以featureID为序列,存储着构成这个FeatureID的所有切割图形。
这里面涉及到的一个问题就是这个所谓的(GridSize)切割比例,到底用多大的比例来切割存储才能达到最好的数据库效果。
先简单说明一下,这个分隔比例的影响:
如果分隔比例过大,如5000*5000,则一快图象中会存储着多个记录。
缺点1:
这样以记录为序的S表,会存储着许多的冗余信息。
因为每一个FeatureClass均存储了这个图象。
缺点2:
在desktop之类客户端软件访问数据库时,有时只需要显示一条记录(放大到记录),此时ArcSDE必须把一个大的图形读取出来,再按照该记录的大小进行裁减。
也消耗性能。
如果分隔比例过小,如50*50则同一个featureclass中的记录会有很多个图象组成。
缺点1:
分隔比例小,导致每个记录均由多个图象组成,大大增加了数据库存储的记录数,增大了存储空间。
缺点2:
分隔比例小,在显示一个记录时,需要读取多条记录,再拼接在一起进行显示。
综上所讲,无论过大,或者过小都会影响存储和性能。
在使用ArcCatalog或者SDE命令行导入数据时,ArcCatalog或SDE会自动计算出一个合适的分隔存储比例。
这个默认的比例一般情况下会比较合适,但因为ArcSDE支持三级分隔比例。
如果只使用一个默认的分隔比例,ArcSDE性能不会最佳。
在以下的情况下,会产生问题:
A、featureclass中的所有记录大小不一致时。
B、大范围的记录时(如河流、道路、边框)
首先,如果记录大小不一,计算出来的分隔比例总是不能达到最优。
另外,对于大范围的记录,默认分隔比例过小。
会导致FeatureClassisread-onlymode。
图层不再可读。
通过ArcCatalog可以修改GridSize的大小。
在《arcsdeconfigurationguidefororacle》中详细介绍了gridsize的设置和调整。
另外,
《TheRoleofGridSizeOptimizationinArcSDEPerformanceTuning》
也会有所帮助。
完。
ps。
说起来简单,做起来很难。
我做过的尝试有:
1、由RAID代替服务器硬盘;
2、设置LDAP、dbblock-size等esri推荐的oracle参数;
3、分离table和index表空间;
4、重新设置gridsize。
另外,如果使用ArcIMS的话,可以用applicationserver集群和多spatialserver来提高性能。
北方数慧系统技术有限公司杜海军
概述:
基于ArcSDE+Oracle的GIS系统,有的时候硬件配置很高档,系统运行依然效率低下。
本文主要讨论如何调整系统架构、数据库、ArcSDE来发挥出硬件的性能,提高应用开发程序的运行效率。
系统环境:
ArcSDE9.1forOracle10g+Oracle10gXE10.2.0.1
Oracle参数设置
Oracle块大小
数据库块大小(db_block_size)16K–32K,Windows下的32位oracle只允许最大16K。
SGA大小
数据缓冲池(db_cache_size),尽量大,最好能加载所有数据,减少磁盘IO,不过不能完全依赖该参数,尽量通过优化SQL语句解决问题,大约使用服务器物理内存的1/2左右,arcsde官方推荐至少512M。
如果需要oracle的建议,参看v$db_cache_advice视图,或者使用oem的可视化界面。
一般认为至少要保证数据访问的90%的命中率。
将SGA预装到物理内存中,即设置PRE_PAGE_SGA=yes。
共享池(shared_pool_size)至少128M,如果程序中使用大量存储过程需要适当调大,推荐到达200M。
Shared_pool_reserved默认的共享池的5%可能需要调整,200M*5%=5M太大了。
java池和大型池针对arcsde的oltp(联机事务处理)型系统来说不需要。
Redo日志缓冲区大小512K或者128K*cpu数目。
这些参数的大小,根据oracle的v$视图去调整。
对于oracle10g最好使用自动内存管理,简化对内存参数的配置。
PGA大小
大小可以设置为(物理内存-操作系统占用内存-其他应用占用的内存)*20%。
设置PGA_AGGREGATE_TARGET的大小为PGA的80%,WORKSPACE_POLICY参数为AUTO,Oracle自动分配客户连接内存,不使用SORT_AREA_SIZE,HASH_AREA_SIZE参数设置的大小。
表空间
使用本地表空间管理。
数据表表空间和索引表空间的分离。
临时表空间不要太小,至少500M左右。
表空间使用自动空间管理,消除了自由空间列表的需求,可以减少数据库的竞争。
数据库控制文件、日志文件、归档文件、数据文件、临时文件、索引等最好放在不同的硬盘,减少io消耗。
游标参数
Open_cursors尽量设置大些,例如2000+。
Session_cached_cursors设置为50+。
cursor_space_for_time设置为TRUE。
cursor_sharing设置为exact。
优化器参数
optimizer_mode
first_rows(1or10)orall_rows,OLTP系统为获取最佳响应时间可以使用fist_rows,需要大量数据汇总等批量操作的话可以设置为all_rows。
该参数可以根据系统当前的主要工作情况来决定。
优化查询必须修改的两个参数,使用如下两个参数的数据库默认数值一定有问题。
Optimizer_index_cost_adj=20,设置索引的成本和全表扫描的成本比为1:
5。
optimizer_index_caching=80,设置索引数据的缓存命中率为80%。
这两个参数需要根据系统运行情况分析设置,以上设置适合大部分的OLTP系统。
把程序包固定到共享池,不交换
保留大的对象在sharedpool中。
大的对象是造成内存碎片的主要原因,为了腾出空间许多小对象需要移出内存,从而影响了用户的性能。
因此需要将一些常用的大的对象保留在sharedpool中。
需要把SDE模式下的arcsde自身的plsql程序包固定到共享池,我们开发的程序包也要固定到共享池。
管理序列
修改序列的缓存数值。
并把序列固定到共享池。
索引和统计量
监视索引
新增、删除、更新等操作导致索引产生碎片,需要定期重建索引。
如果需要创建位图索引的话,需要根据需要设置create_bitmap_area_size的大小,其中oracle标准版不支持位图索引的功能。
如果在sql查询中使用了upper、length、substr等oracle内置或者我们写的函数,需要在相关字段建立函数索引,其他的索引无效,并把QUERY_REWRITE_ENABLED设置为true。
尽量减少不必要的索引,有些多字段都需要的索引,根据需要尽量使用组合索引。
索引越多,数据库更新操作越慢。
删除未使用过的索引,可以降低DML操作的成本,从而提升系统性能。
统计量
基于成本的优化器在生成执行计划的时候需要表和索引的统计量信息,否则生成的执行计划不是最优的。
使用ANALYZE命令或者DBMS_STATS包,Oracle推荐使用DBMS_STATS包,该包能获取的统计信息全面。
监视全表扫描
尽量减少全表扫描。
使用V$视图监视全表扫描的发生。
合理的DB_FILE_MULTIBLOCK_READ_COUNT能减少tablescan需要调用的IO次数,提高性能(与OS相关),但是可能增加全表扫描发生的概率。
可以设置oracle一次IO读取的块数为32,该参数比较适合普通的OLTP和OLAP系统,需要注意的是本参数设置的越大,优化器越倾向于使用全部表扫描。
监视排序操作
避免发生在临时表空间的排序操作,否则需要提高sort_area_size的数值。
如果使用了自动内存分配的话,需要增加Pga_aggregate_target的数值。
版本管理
版本资料库表
arcsde使用STATES和STATE_LINEAGES表记录版本状态和父子关系信息。
A和D表记录要素的变化信息。
我们需要通过Oracle任务定期更新这两个表的统计信息和定期重建索引。
state_lineages是IndexOrganizedTable(IOT)。
定期压缩版本
压缩可以提高查询的速度,减少逻辑IO,最好每天晚上执行压缩版本的操作,sdeversion–ocompress-N。
dbtune参数中的compress_rollback_segment设置为最大表的10%+。
如果使用了undo表空间的话,需要删除此参数,否则会出现错误,arcsde9屏蔽了该错误,并可以继续进行。
压缩之前获取B,A,D,states,state_lineages这些表的统计信息,加快压缩速度。
数据压缩后可以truncate增量表,重新设置表的高水位标记,优化更新操作。
压缩后如果数据发生移动,重建索引和统计信息。
应用程序优化
应用系统结构
主要优化SQL语句的编写和系统结构设计,其中SQL语句导致系统性能问题的可能性比较大。
绑定变量
Arcsde9.2自动绑定变量。
在我们系统使用的sql语句中最好使用绑定变量。
如果我们写的存储过程使用了动态SQL语句,则需要使用绑定变量,静态SQL语句自动绑定变量。
当前被执行的语句和共享池中的语句必须完全相同,包括字符、大小写、空格,否则不能使用共享池中的SQL语句。
性能故障检查
Oracle的Trace文件
阅读trace文件使用tkprof命令。
SQLtrace工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中.这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时间等.这些数据将可以用来优化系统。
Statspack
收集系统运行的快照,分析系统的缺点。
通过系统快照,