关于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 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条提交一次,节省了大量的频繁交互,速度就有了很大的提升。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】使用 lsof 查找打开的文件

在 UNIX 环境中&#xff0c;文件无处不在&#xff0c;这便产生了一句格言&#xff1a;“任何事物都是文件”。通过文件不仅仅可以访问常规数据&#xff0c;通常还可以访问网络连接和硬件。在有些情况下&#xff0c;当您使用 ls 请求目录清单时&#xff0c;将出现相应的条目。在…

ESLint简介

ESLint简介 ESLint是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具&#xff0c;使用它可以避免低级错误和统一代码的风格。如果每次在代码提交之前都进行一次eslint代码检查&#xff0c;就不会因为某个字段未定义为undefined或null这样的错误而导致服务崩溃&…

数据科学与大数据是什么意思_什么是数据科学?

数据科学与大数据是什么意思Data Science is an interdisciplinary field that uses a combination of code, statistical analysis, and algorithms to gain insights from structured and unstructured data.数据科学是一个跨学科领域&#xff0c;它结合使用代码&#xff0c;…

C#制作、打包、签名、发布Activex全过程

一、前言 最近有这样一个需求&#xff0c;需要在网页上面启动客户端的软件&#xff0c;软件之间的通信、调用&#xff0c;单单依靠HTML是无法实现了&#xff0c;因此必须借用Activex来实现。由于本人主要擅长C#&#xff0c;自然本文给出了用C#实现的范例&#xff0c;本文的预期…

用Python创建漂亮的交互式可视化效果

Plotly is an interactive Python library that provides a wide range of visualisations accessible through a simple interface.Plotly是一个交互式Python库&#xff0c;通过简单的界面即可提供广泛的可视化效果。 There are many different visualisation libraries avai…

CCF 201809-1 买菜

问题描述| 试题编号&#xff1a; | 201809-2 | | 试题名称&#xff1a; | 买菜 | | 时间限制&#xff1a; | 1.0s | | 内存限制&#xff1a; | 256.0MB | 问题描述 小H和小W来到了一条街上&#xff0c;两人分开买菜&#xff0c;他们买菜的过程可以描述为&#xff0c;去店里买一…

笔试题③

1.线程间通信 handler机制 2.AsyncTask 异步任务 3.HandlerThread 子线程中创建了一个 Looper对象 可以在子线程里使用消息机制 IntentService 带了HandlerThread 并且创建了一个子线程的handler 在服务中 创建子线程执行耗时操作 耗时操作执行结束之后服务退出 如果想在Serv…

Hadoop 2.0集群配置详细教程

Hadoop 2.0集群配置详细教程 前言 Hadoop2.0介绍 Hadoop是 apache 的开源 项目&#xff0c;开发的主要目的是为了构建可靠&#xff0c;可拓展 scalable &#xff0c;分布式的系 统&#xff0c; hadoop 是一系列的子工程的 总和&#xff0c;其中包含 1. hadoop common &#xff…

php如何减缓gc_管理信息传播-使用数据科学减缓错误信息的传播

php如何减缓gcWith more people now than ever relying on social media to stay updated on current events, there is an ethical responsibility for hosting companies to defend against false information. Disinformation, which is a type of misinformation that is i…

[UE4]删除UI:Remove from Parent

同时要将保存UI的变量清空&#xff0c;以释放占用的系统内存 转载于:https://www.cnblogs.com/timy/p/9842206.html

MySQL基础部分总结

MySQL 1、选择数据库 use dbnameshow databases;2、数据表 show tablesmysql> show columns from customers;mysql> desc customers;3、show 语句 show statusshow create databasesshow create tableshow grants4、select 检索 4.1.1版本后不再区分大小写&#xff0c;但…

BZOJ2503: 相框

Description P大的基础电路实验课是一个无聊至极的课。每次实验&#xff0c;T君总是提前完成&#xff0c;管理员却不让T君离开&#xff0c;T君只能干坐在那儿无所事事。先说说这个实验课&#xff0c;无非就是把几根导线和某些元器件&#xff08;电阻、电容、电感等&#xff09;…

泰坦尼克号 数据分析_第1部分:泰坦尼克号-数据分析基础

泰坦尼克号 数据分析My goal was to get a better understanding of how to work with tabular data so I challenged myself and started with the Titanic -project. I think this was an excellent way to learn the basics of data analysis with python.我的目标是更好地了…

Imperva开源域目录控制器,简化活动目录集成

Imperva已公开发布域目录控制器&#xff08;Domain Directory Controller&#xff0c;DDC&#xff09;的源代码&#xff0c;这是一个Java库&#xff0c;用于简化常见的Active Directory集成。 与Java的LdapContext不同&#xff0c;这个库构建在Apache Directory LDAP之上&#…

2018.10.24 NOIP模拟 小 C 的序列(链表+数论)

传送门 考虑到a[l],gcd(a[l],a[l1]),gcd(a[l],a[l1],a[l2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l1]),gcd(a[l],a[l1],a[l2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l1]),gcd(a[l],a[l1],a[l2])....gcd(a[l]...a[r])是可以分成最多logloglog段且段内的数都是相同的。 那么我们用…

vba数组dim_NDArray — —一个基于Java的N-Dim数组工具包

vba数组dim介绍 (Introduction) Within many development languages, there is a popular paradigm of using N-Dimensional arrays. They allow you to write numerical code that would otherwise require many levels of nested loops in only a few simple operations. Bec…

Nodejs教程08:同时处理GET/POST请求

示例代码请访问我的GitHub&#xff1a; github.com/chencl1986/… 同时处理GET/POST请求 通常在开发过程中&#xff0c;同一台服务器需要接收多种类型的请求&#xff0c;并区分不同接口&#xff0c;向客户端返回数据。 最常用的方式&#xff0c;就是对请求的方法、url进行区分判…

关于position的四个标签

四个标签是static&#xff0c;relative&#xff0c;absolute&#xff0c;fixed。 static 该值是正常流&#xff0c;并且是默认值&#xff0c;因此你很少看到&#xff08;如果存在的话&#xff09;指定该值。 relative&#xff1a;框的位置能够相对于它在正常流中的位置有所偏移…

python算法和数据结构_Python中的数据结构和算法

python算法和数据结构To至 Leonardo da Vinci达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this article is to give you a panorama of data structures and algorithms in Python. This topic is very important for a Data Scientist in order to help …

CSS:元素塌陷问题

2019独角兽企业重金招聘Python工程师标准>>> 描述&#xff1a; 在文档流中&#xff0c;父元素的高度默认是被子元素撑开的&#xff0c;也就是子元素多高&#xff0c;父元素就多高。但是当子元素设置浮动之后&#xff0c;子元素会完全脱离文档流&#xff0c;此时将会…