设为首页 加入收藏

TOP

关于Oracle实时数据库的优化思路(一)
2015-11-21 01:32:56 来源: 作者: 【 】 浏览:0
Tags:关于 Oracle 实时 数据库 优化 思路

关于实时数据库的优化思路

背景

大概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 J

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇windows上安装oracle12c到69%时卡.. 下一篇Oracle备忘录1

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: