日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2023/11/30 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Oracle实时数据库的优化思路 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ???關(guān)于實(shí)時(shí)數(shù)據(jù)庫的優(yōu)化思路

背景

大概168個(gè)換熱站機(jī)組,每套機(jī)組將近400個(gè)點(diǎn),整體有6萬多個(gè)點(diǎn)需要進(jìn)行實(shí)時(shí)更新。數(shù)據(jù)庫里其中有一個(gè)監(jiān)控參數(shù)表(yxjk_jkcs),每一個(gè)點(diǎn)位屬性都在里面存放,其中有一個(gè)字段CS_VALUE 是存放被更新的實(shí)時(shí)數(shù)據(jù)。

現(xiàn)象

? ??所有數(shù)據(jù)更新一次的時(shí)間,大概為10分鐘,而達(dá)不到2分鐘一更新的實(shí)時(shí)數(shù)據(jù)要求的效果。而且數(shù)據(jù)在更新的過程中,對(duì)服務(wù)器的資源利用量很大。

分析思路及過程:

一、利用 select * from v$sgainfo;語句查看了系統(tǒng)全局區(qū)域

查看了Buffer Cache Size

以及Shared Pool Size ,這兩個(gè)一個(gè)是負(fù)責(zé)結(jié)果集的緩存大小,一個(gè)是負(fù)責(zé)存儲(chǔ)解析SQL語句

select *from dict where table_name like '%SGA%'—全局緩存

select *from v$version;--數(shù)據(jù)庫版本情況

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%';

?????從語句的返回結(jié)果中判斷,緩存區(qū)的字節(jié)大小為400兆,而32位系統(tǒng),oracle最大可以支持到1.7G。根據(jù)這樣的結(jié)果,對(duì)緩存區(qū)進(jìn)行了設(shè)置,擴(kuò)大到了1.4G,保證內(nèi)存的使用空間。

二、利用select * from v$sql查看SQL語句執(zhí)行的日志

select * from v$sql? wherelower(sql_text) like lower('%yxjk_jkcs%');

然后根據(jù)以上的語句得出,語句的執(zhí)行次數(shù)比較多,說明沒有執(zhí)行預(yù)編譯。

??????declare i number;

begin

for i in 1 .. 60000 loop

?update yxjk_jkcs set CS_VALUE='{體驗(yàn)中換熱站154.tyzx154.scyx_echysx}'where JKD_ID='tyzx154' and CS_ID='scyx_echysx';

end loop;

rollback;

end;

利用oracle本身實(shí)驗(yàn)了一下循環(huán)預(yù)編譯,發(fā)現(xiàn)執(zhí)行6萬次只用幾秒。同時(shí)發(fā)現(xiàn)這個(gè)表中的參與的兩個(gè)查詢條件 JKD_ID和CS_ID是分開的索引。于是把這兩個(gè)字段聯(lián)合起來建立了一個(gè)索引。速度又增快了一些。

三、.net下進(jìn)行預(yù)編譯程序執(zhí)行

? 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();

??????????????????????????????? }

不過在這種情況下,發(fā)現(xiàn)交互后,速度仍然不夠理想。

?

?

四、查詢?cè)趫?zhí)行過程中,哪個(gè)語句及應(yīng)用比較慢。

select a.seconds_in_wait, a.* fromv$session_wait a where a.wait_class<>'Idle' order by a.seconds_in_waitdesc--查到的應(yīng)用慢

查詢到了操作,執(zhí)行了日志操作,并頻繁的進(jìn)行的commit操作導(dǎo)致。

select?a.* from v$session a? wherea.sid=138

查到了相應(yīng)應(yīng)用的相關(guān)信息,就是用傳統(tǒng)的數(shù)據(jù)提交方式,因?yàn)?net下的每一個(gè)ExecutNonquery相當(dāng)于一次語句并一次提交,所以需要變成事務(wù)型,多條語句一次提交從而化對(duì)應(yīng)程序的操作方式。

五、減少提交次數(shù),累計(jì)事務(wù)

?

??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條提交一次,節(jié)省了大量的頻繁交互,速度就有了很大的提升。

?

?

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的关于Oracle实时数据库的优化思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。