seo查询工具网站,一起做网店官网下载,软硬件开发都包括什么,免费微信小程序模板关于实时数据库的优化思路
背景
大概168个换热站机组#xff0c;每套机组将近400个点#xff0c;整体有6万多个点需要进行实时更新。数据库里其中有一个监控参数表(yxjk_jkcs)#xff0c;每一个点位属性都在里面存放#xff0c;其中有一个字段CS_VALUE 是存放被更新的实时… 关于实时数据库的优化思路
背景
大概168个换热站机组每套机组将近400个点整体有6万多个点需要进行实时更新。数据库里其中有一个监控参数表(yxjk_jkcs)每一个点位属性都在里面存放其中有一个字段CS_VALUE 是存放被更新的实时数据。
现象 所有数据更新一次的时间大概为10分钟而达不到2分钟一更新的实时数据要求的效果。而且数据在更新的过程中对服务器的资源利用量很大。
分析思路及过程:
一、利用 select * from v$sgainfo;语句查看了系统全局区域
查看了Buffer Cache Size
以及Shared Pool Size 这两个一个是负责结果集的缓存大小一个是负责存储解析SQL语句
select *from dict where table_name like %SGA%—全局缓存
select *from v$version;--数据库版本情况
select *from v$sgastat WHERE POOLshared pool order by bytes desc;
SELECT *FROM V$SGAINFO;
select *from v$sgastat;
select *from v$sga;
select *from v$sga_value;
select *from v$sgastat where poolshared pool
selectvalue/1024/1024 from v$parameter where name like %sga_target%; 从语句的返回结果中判断缓存区的字节大小为400兆而32位系统oracle最大可以支持到1.7G。根据这样的结果对缓存区进行了设置扩大到了1.4G保证内存的使用空间。
二、利用select * from v$sql查看SQL语句执行的日志
select * from v$sql wherelower(sql_text) like lower(%yxjk_jkcs%);
然后根据以上的语句得出语句的执行次数比较多说明没有执行预编译。 declare i number;
begin
for i in 1 .. 60000 loop update yxjk_jkcs set CS_VALUE{体验中换热站154.tyzx154.scyx_echysx}where JKD_IDtyzx154 and CS_IDscyx_echysx;
end loop;
rollback;
end;
利用oracle本身实验了一下循环预编译发现执行6万次只用几秒。同时发现这个表中的参与的两个查询条件 JKD_ID和CS_ID是分开的索引。于是把这两个字段联合起来建立了一个索引。速度又增快了一些。
三、.net下进行预编译程序执行 cmdstr updateyxjk_jkcs set CS_VALUE:value where JKD_ID:jkdid and CS_ID:jkdcs; OracleCommand cmd newOracleCommand(cmdstr, conn); cmd.Parameters.Clear(); OracleParameter opvalue newOracleParameter(:value,OracleType.VarChar, 100); //opvalue.OracleType OracleType.VarChar; //opvalue.ParameterName value; cmd.Parameters.Add(opvalue); OracleParameter opjkd newOracleParameter(:jkdid,OracleType.VarChar, 32); cmd.Parameters.Add(opjkd); OracleParameteropjkcs new OracleParameter(:jkdcs, OracleType.VarChar,200); cmd.Parameters.Add(opjkcs); for (int i 0; i 60000; i) { cmd.Parameters[:value].Value i.ToString(); cmd.Parameters[:jkdid].Value jdyj01^jdyj01; cmd.Parameters[:jkdcs].Value L_T_two_supply_Y3; cmd.ExecuteNonQuery(); }
不过在这种情况下发现交互后速度仍然不够理想。 四、查询在执行过程中哪个语句及应用比较慢。
select a.seconds_in_wait, a.* fromv$session_wait a where a.wait_classIdle order by a.seconds_in_waitdesc--查到的应用慢
查询到了操作执行了日志操作并频繁的进行的commit操作导致。
select a.* from v$session a wherea.sid138
查到了相应应用的相关信息就是用传统的数据提交方式因为.net下的每一个ExecutNonquery相当于一次语句并一次提交所以需要变成事务型多条语句一次提交从而化对应程序的操作方式。
五、减少提交次数累计事务 OracleConnection myConnection new OracleConnection(connstr); myConnection.Open(); OracleCommand myCommand myConnection.CreateCommand(); OracleTransactionmyTrans; myTrans myConnection.BeginTransaction(IsolationLevel.ReadCommitted); myCommand.Transaction myTrans; cmdstr update yxjk_jkcs set CS_VALUE:value where JKD_ID:jkdidand CS_ID:jkdcs; myCommand.CommandText cmdstr; myCommand.Parameters.Clear(); OracleParameter opvalue new OracleParameter(:value,OracleType.VarChar, 100); myCommand.Parameters.Add(opvalue);
OracleParameter opjkd newOracleParameter(:jkdid, OracleType.VarChar, 32);
myCommand.Parameters.Add(opjkd); OracleParameter opjkcs newOracleParameter(:jkdcs, OracleType.VarChar, 200); myCommand.Parameters.Add(opjkcs); for (int p 0; p myllsls.Length;p) { stringonesql myllsls[p]; int fs onesql.IndexOf( where JKD_ID); string jkdidstr onesql.Substring(fs 14); string[]jkdcs jkdidstr.Split(new string[] { and CS_ID },StringSplitOptions.RemoveEmptyEntries); string jkd jkdcs[0]; string jkcs jkdcs[1].ToString().Replace(\r, ); myCommand.Parameters[:value].Value p.ToString()##########; myCommand.Parameters[:jkdid].Value jkd.Replace(, ); myCommand.Parameters[:jkdcs].Value jkcs.Replace(, ); myCommand.ExecuteNonQuery(); if (p %5000 0) { myTrans.Commit(); myTrans myConnection.BeginTransaction(IsolationLevel.ReadCommitted); Console.WriteLine(p.ToString() DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss) ); mydialog.WriteLine(p.ToString() DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss)); } }
以这样的方式每5000条提交一次节省了大量的频繁交互速度就有了很大的提升。