关于Oracle实时数据库的优化思路
来源:互联网 发布:淘宝女店主猝死 编辑:程序博客网 时间:2024/06/13 23:33
关于实时数据库的优化思路
背景
大概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 POOL='shared 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 pool='shared 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_ID='tyzx154' and CS_ID='scyx_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_class<>'Idle' order by a.seconds_in_waitdesc--查到的应用慢
查询到了操作,执行了日志操作,并频繁的进行的commit操作导致。
select a.* from v$session a wherea.sid=138
查到了相应应用的相关信息,就是用传统的数据提交方式,因为.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条提交一次,节省了大量的频繁交互,速度就有了很大的提升。
- 关于Oracle实时数据库的优化思路
- Oracle数据库基本优化思路
- 数据库优化的思路
- 数据库优化的思路
- 关于Oracle数据库的性能优化心得
- oracle数据库的优化-关于rownum操作
- 关于Oracle数据库的性能优化心得
- 关于Oracle数据库的查询优化
- 关于SVN+sersync实时同步到远程服务器的思路
- 数据库优化的一些概念和思路
- c# 访问实时数据库的性能优化
- ORACLE数据库的优化
- ORACLE数据库的优化
- Oracle数据库的优化
- oracle数据库的优化
- 面试中回答关于oracle数据库优化的方法clear
- 面试中回答关于oracle数据库优化的方法
- 关于Oracle数据库优化的几点总结
- oracle 使用uuid生成主键
- 社説 20150731 集団的自衛権 法的安定性は確保されている
- 专利申请指南
- OO设计原则总结
- jQuery模糊匹配checkbox全选 value实现checkbox部分或全部全选
- 关于Oracle实时数据库的优化思路
- 将Word转换成PDF格式文档的方法
- java.lang.NoClassDefFoundError: org/openqa/selenium/htmlunit/HtmlUnitDriver 问题解决方案
- 一个.vimrc的示例
- 大小端问题
- C语言程序的编译和链接过程
- vimrc编写指南
- Android 的manifest解析
- HDU 4983 Goffi and GCD(数列、欧拉函数)