關於Oracle實時資料庫的優化思路

2021-12-30 10:59:55 字數 4091 閱讀 1724

大概168個換熱站機組,每套機組將近400個點,整體有6萬多個點需要進行實時更新。資料庫裡其中有乙個監控參數列(yxjk_jkcs),每乙個點位屬性都在裡面存放,其中有乙個欄位cs_value 是存放被更新的實時資料。

所有資料更新一次的時間,大概為10分鐘,而達不到2分鐘一更新的實時資料要求的效果。而且資料在更新的過程中,對伺服器的資源利用量很大。

檢視了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 wherelower(sql_text) like lower('%yxjk_jkcs%');

然後根據以上的語句得出,語句的執行次數比較多,說明沒有執行預編譯。

declare i number;

begin

for i in 1 .. 60000 loop

update yxjk_jkcs set cs_value=''where jkd_id='tyzx154' and cs_id='scyx_echysx';

end loop;

rollback;

end;

利用oracle本身實驗了一下迴圈預編譯,發現執行6萬次只用幾秒。同時發現這個表中的參與的兩個查詢條件 jkd_id和cs_id是分開的索引。於是把這兩個字段聯合起來建立了乙個索引。速度又增快了一些。

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

= oracletype.varchar;

= "@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++)

不過在這種情況下,發現互動後,速度仍然不夠理想。

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

stringjkdcs = jkdidstr.split(new string ,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條提交一次,節省了大量的頻繁互動,速度就有了很大的提公升。

實時資料庫Server To Server同步方案

sis 側實時資料庫 mis側實時資料庫同步,中間過物理隔離網閘,傳輸資料,滿足 電力二次系統安全防護方案 要求,實現可信資料從高安全區向低安全區的單向傳遞。1 網閘原理 連線建立後,內網側主動向外網側傳送資料,外網側可選擇應答或不應答 或是外網側傳送乙個小於等於 4個位元組的請求,內網側以相應的資...

實時資料庫Server To Server同步方案

sis側實時資料庫 mis側實時資料庫同步,中間過物理隔離網閘,傳輸資料,滿足 電力二次系統安全防護方案 要求,實現可信資料從高安全區向低安全區的單向傳遞 1 網閘原理 連線建立後,內網側主動向外網側傳送資料,外網側可選擇應答或不應答 或是外網側傳送乙個小於等於4個位元組的請求,內網側以相應的資料進...

實時資料庫Server To Server同步方案

sis側實時資料庫 mis側實時資料庫同步,中間過物理隔離網閘,傳輸資料,滿足 電力二次系統安全防護方案 要求,實現可信資料從高安全區向低安全區的單向傳遞 1 網閘原理 連線建立後,內網側主動向外網側傳送資料,外網側可選擇應答或不應答 或是外網側傳送乙個小於等於4個位元組的請求,內網側以相應的資料進...