年度末NC项目系统优化--GBU技术支持部代群义dqy@ufida.com.cnNC用户年度末时往往是使用NC最频繁的时候,在这个时候效率问题便变得尤为突出,为了防止因为应用服务器配置、NC客户端、数据库配置不当而引起的效率问题,保证客户业务顺利进行,需要前方顾问参考下面内容做以下优化工作:应用服务器JAVA参数说明-Xms:设置初始分配的内存堆大小-Xmx:设置最大可分配的内存堆大小-XX:PermSize:设置永久内存区大小-XX:MaxPermSize:设置最大永久内存区大小JAVA参数配置建议UFmiddleware5.0中间件参数系统自带得是SUNJDK1.5,对应参数已经设置。"-Server-Xmx768m-XX:PermSize=128m-XX:MaxPermSize=256m"当使用其他环境JDK时,参考JDK有关参数进行调整。IBMWebSphere6.1参数当中间件是IBMWebSphere6.1时,对应参数设置有关的文件中。用户通过"wasSysConfig.bat"进行设置。具体选择"deployment"----"JVM",可以设置最小堆大小;最大堆大小;当系统是32位系统,系统具有2G或更多内存时,推荐JVM设置-Xms768M-Xmx1024M当系统是64位系统,系统具有4G或更多内存时,推荐JVM设置-Xms1024M-Xmx2048MWAS中Java虚拟机参数设置方法:http://IP:9060/ibm/consoleNC客户端NC浏览器客户端若设置不当,会出现使用时间长后浏览器越来越慢,以及一些大数据操作浏览器灰屏等现象;还有一些大的数据查询操作时间长等等现象。对NC客户端浏览器而言,主要是以下需要设置:一:客户端浏览器java插件参数设置:浏览器java插件参数默认能使用最大内存为64M,如果不进行设置修改的话,即使客户端机器本身物理内存1G或2G足够大,NC界面在浏览器中也只能用到64M内存;这样造成的影响是:使用时间长后浏览器会越来越慢;一些大数据操作浏览器灰屏或无法显示。可以按以下步骤设置浏览器java插件参数:1:在开始->控制面板中,双击java咖啡杯图标:2:在弹出界面中选择第二个页签界面,即常规后面的java界面->java小应用程序Rutime设置下->点查看:3:在弹出的小窗口第四列设置-Xmx256m(或者-Xmx200m,或者-Xmx350m等更大或更小)或者–Xms128m-Xmx256m注意:需要用英文输入法,并且大小写敏感。有些机器设置256M后,会出现访问NC登录页面报无法载入jvm,这个时候需要调小设置为-Xmx200m,或继续调整小.4:点确定-》点应用;重启浏览器,此设置生效。二:需要启用NC登录界面中的压缩传输功能有一些大的数据查询操作会需要从服务器端下载大量数据到客户端显示,如果不选择压缩传输的话,可能网络传输量会很大,如果选用压缩传输,对大数据量的传输,其压缩比很多时候能达到1:5甚至1:10,会较大减轻网络传输量及时间。可以按以下模式设置1:点击选项按钮2:勾选上压缩远程调用流选项注:第一次勾选上后,以后进入浏览器此选项是默认勾选上的三:根据客户实际情况,可以考虑启用并初始化客户端数据缓存客户端数据缓存主要是将相关基础数据缓存到本地,以后本地对基础数据的参照可以先从本地参照而不是每次都从服务器端下载参照;从而达到减少远程调用次数,提高界面操作速度功能。1:如图,点击NC右上角的帮助,在出现的下拉列单中点击缓存配置2:在弹出的界面中勾选中启动数据缓存,此时会再弹出一个界面,选择是。3:此时会将相关基础数据初始化下载到本地四:NC客户端程序启用说明有的时候在用浏览器无法满足应用要求情况下,可以通过启用NC客户端程序来代替浏览器应用。1:启动NCSysConfig.bat(NCSysConfig.sh),选中Deplopment节点界面,点击右边GenClientCode按钮,如图,在弹出界面中设置应用服务器名与端口,以及生产的客户端代码安装路径。2:客户端代码生成后,进入其目录,如图,运行setup.exe,指定客户端代码的安装路径3:点击下一步进入安装4:安装完成后;可以通过开始->所有程序->ERPNC列表中,可以选择启动NC客户端;或者进入NC客户端程序目录如C:\ncv5client\bin下面,运行clientStartup.bat启动NC客户端程序。注:可以通过调整或编辑clientStartup.bat文件来修改其内存设置参数注意:(1):NC客户端代码所在路径:一般在当前操作系统登录用户所在目录下,如:C:\DocumentsandSettings\Administrator\NCCACHE\,其下会有对应应用服务器+路径+端口为唯一标志的代码目录如10.0.33.121_-ufida-ufsoft_80。(2):什么情况下建议用NC客户端程序代替浏览器访问NC一是在有些机器浏览器使用java插件有问题,经常导致退出或无法使用情况下;二是有些用户的操作数据量很大,使用浏览器java插件内存无法设置上去,导致相关大数据操作在客户端非常慢,并且导致客户端cpu持续很高情况下。三网络条件差的地方,网络下载慢.以上两种情况可以考虑使用NC客户端程序解决。五:客户端浏览器访问NC不能走代理模式因为NC应用中存在大量的实时交互与动态数据传输,所以访问NC不能走代理服务器,不然,对访问效率有很大的影响。1:禁用代理服务器如图,点浏览器工具->属性,在打开窗口中选择连接->局域网设置,在弹出的小窗口中去掉代理服务器下面的选中的勾。这样,浏览器就不走代理服务器了。2:不禁用代理服务器,但需要指定NC服务器不走代理服务器如图,点浏览器工具->属性,在打开窗口中选择连接->局域网设置,在弹出的小窗口中不去掉代理服务器下面的选中的勾,而是选择高级,这时会弹出如图代理服务器设置界面,在界面的对于以下列开头的地址不使用代理服务器栏中添加你的应用服务器地址:如果你的应用服务器地址是20.10.130.15之类,则添加20.10.130.*即可(不同地址之间以;号隔开)。这样,即使你不禁用代理服务器,经过指定,你访问NC的服务器上的http应用也不会走代理模式了。六:浏览器属性->常规中->Internet临时文件->设置中选择每次访问时刷新如图:这个设置对IUFO等动态页面显示比较重要,因为有的防火墙与代理服务器有页面缓存功能,而iufo的页面都是动态页面,如果访问的是缓存中的页面的话有可能就出来一个空白页面;这样设置后,就能避免以上问题。数据库服务器(一)保证统计信息的最新与准确性如果做的统计信息是一个月以前的事情了,或者最近数据量比较大,最好重新做一下统计信息更新:(1)、对SQLServer使用QueryAnalyzer登陆到SQLServer,执行:use用户数据库名称sp_updatestats上述语句会把该数据库内的所有表、索引的统计信息更新。如果只想更新其中某个对象的统计信息,可执行UPDATESTATISTICS表名(2)、DB2数据库优化对使用DB2数据库用户,可以使用"reorgchk"命令更新统计信息,方法如下,注意连接数据库和用户、密码和实际业务的区别:db2"connecttoNC56userdb2inst1usingdb2inst1"db2"reorgchkupdatestatisticsontableall"上述语句会更新该数据库内该用户所拥有的所有表、索引的统计信息如果只想更新其中某个对象的统计信息,可执行RUNSTATSONTABLE(表名)andindexesall(3)、Oracle数据库优化NC56版本针对ORACLE的优化脚本。其它版本NC的发版盘中都有,请对应参考。对于Oracle用户,更新指定表统计信息方法需要在sqlplus中执行。下面是在"sqlplus"中执行优化操作命令,"NC56"是当前系统存储业务数据的用户。这个存储过程执行中,如果个别表分析出错后,会继续处理其他表,并将错误信息写入analyze_log表。需要特别注意,在NC502升级到NC5.6的前后,都要进行本操作,否则会导致执行计划混乱,整个NC系统效率变低。SQL>connectNC56/NC56@oracleSQL>grantcreateanytabletonc56;--这一步非常重要,需要显式地赋予用户建表权限CREATEORREPLACEPROCEDUREANALYZE_TBASOWNER_NAMEVARCHAR2(100);V_LOGINTEGER;V_SQL1VARCHAR2(800);V_TABLENAMEVARCHAR2(50);CURSORCUR_LOGISSELECTCOUNT(*)FROMUSER_TABLESWHERETABLE_NAME='ANALYZE_LOG';--1BEGIN--DBMS_OUTPUT.ENABLE(buffer_size=>100000);--1.1BEGINOPENCUR_LOG;FETCHCUR_LOGINTOV_LOG;IFV_LOG=0THENEXECUTEIMMEDIATE'CREATETABLEANALYZE_LOG(USER_NAMEVARCHAR(20),OP_TIMECHAR(19)DEFAULTto_charhh24:mi:ss''),ERROR_TEXTVARCHAR(200),TABLE_NAMEVARCHAR(40))';ENDIF;END;SELECTUSERINTOOWNER_NAMEFROMDUAL;V_SQL1:='INSERTINTOANALYZE_LOG(USER_NAME,ERROR_TEXT,TABLE_NAME)VALUES('''||OWNER_NAME||''',''ANALYZEBEGIN'',''ALL'')';EXECUTEIMMEDIATEV_SQL1;sys.dbms_stats.gather_schema_stats(ownname=>UPPER(OWNER_NAME),estimate_percent=>100,method_opt=>'FORALLINDEXEDCOLUMNS',cascade=>TRUE);V_SQL1:='INSERTINTOANALYZE_LOG(USER_NAME,ERROR_TEXT,TABLE_NAME)VALUES('''||OWNER_NAME||''',''ANALYZEEND'',''ALL'')';EXECUTEIMMEDIATEV_SQL1;commit;--1.2deletetmptbstatiticsandlockstatisticsBEGINforxin(selecta.table_name,a.last_analyzed,b.stattype_lockedfromuser_tablesa,user_tab_statisticsbwherea.temporary='Y'anda.table_name=b.table_nameand(b.STATTYPE_LOCKEDisnullora.last_analyzedisnotnull))LOOPIFx.last_analyzedISNOTNULLTHEN--deletestatsdbms_stats.delete_table_stats(ownname=>user,tabname=>x.table_name,force=>TRUE);ENDIF;IFx.stattype_lockedISNULLTHEN--lockstatsdbms_stats.lock_table_stats(ownname=>user,tabname=>x.table_name);ENDIF;ENDLOOP;end;EXCEPTIONWHENOTHERSTHENIFCUR_LOG%ISOPENTHENCLOSECUR_LOG;ENDIF;commit;end;/SQL>execANALYZE_TB;下面提供的脚本示范如何创建定时任务,也是要在"sqlplus"中运行。当天的凌晨2点开始更新统计信息,以后每2天的凌晨2点更新统计信息。注意建立当前job时,使用NC的用户连接数据库执行就可以了。具体优化时间设置用户根据实际情况灵活调整。VARIABLEJOBNONUMBER;VARIABLEINSTNONUMBER;BEGINSELECTINSTANCE_NUMBERINTO:INSTNOFROMV$INSTANCE;DBMS_JOB.SUBMIT(:JOBNO,'ANALYZE_TB;',TRUNC(SYSDATE)+1+2/24,'TRUNC(SYSDATE)+2+2/24',TRUE,:INSTNO);COMMIT;END;/对于升级用户,如果以前有相关定时任务设置,建议用户清除以前的定时任务。具体查看系统中的定时任务通过下面SQL执行即可。发现v3留下的统计数据库的job,应该及时删除掉。SQL>selectjob,last_date,this_date,next_date,what,brokenfromuser_jobs;13052009-3-43:10:142009-3-62:00:00"ANALYZE_TB;"N例如运行上面的sql查询出来的第一列即“305”,以下sql为:SQL>execsys.dbms_job.remove('305');如果使用ORACLE10G注意关闭ORACLE自动更新统计信息的任务SQL>ExecDBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');上述SQL会把该用户模式下的所有表、索引的统计信息更新。如果只想更新其中某个对象的统计信息,可执行analyzetable表名computestatisticsanalyzetable表名computestatisticsforallindexes;analyzetable表名computestatisticsforallcolumns;(二)考虑重建索引如果系统已经运行1年以上,并且数据变化很大,可以考虑重建索引.sqlserver:在用户数据库先执行:select'dbccdbreindex('+name+')'fromsysobjectswherextype='u'然后把运行结果执行oracle:执行:setpagesize20000spoolc:\index.sql;select'alterindex'||index_name||'rebuildonline;'fromuser_indexes;spooloff;编辑c:\index.sql文件,删除除'alterindex......'外的其他内容。运行:@@c:\index.sql;db2:在用户数据库先执行:select'REORGTABLE'||rtrim(TBCREATOR)||'.'||TBNAME||'INDEX'||rtrim(CREATOR)||'.'||NAMEfromsysibm.sysindexes然后把运行结果执行