程序代碼未使用綁定變量對(duì)醫(yī)院信息系統(tǒng)健康運(yùn)行的危害性
原理:語(yǔ)句的解析過(guò)程
關(guān)鍵判斷指標(biāo)項(xiàng):每秒解析量
每秒解析量過(guò)高(也稱解析過(guò)量),通常意味著正在運(yùn)行的程序未采用綁定變量來(lái)書寫代碼。
未使用綁定變量問(wèn)題的危害
1、直接危害:解析過(guò)量會(huì)導(dǎo)致系統(tǒng)資源被大量占用(主要是CPU,內(nèi)存資源),影響整個(gè)業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫(kù)的性能。
2、間接危害:解析過(guò)量因?yàn)檎加觅Y源,造成事務(wù)執(zhí)行時(shí)間變長(zhǎng),間接引起各種非空閑等待事件增加,進(jìn)而造成業(yè)務(wù)系統(tǒng)的卡慢問(wèn)題。
未使用綁定變量問(wèn)題的危害案例1
假設(shè)某大型三甲醫(yī)院每天的門診掛號(hào)量約為10000次。
情況1:門診程序的掛號(hào)事務(wù)對(duì)應(yīng)SQL代碼采用綁定變量的方式
這時(shí)所有的掛號(hào)事務(wù)被數(shù)據(jù)庫(kù)看成是同一種事務(wù)處理方式,只是具體到每一次掛號(hào)事務(wù)帶入的變量值不同,比如病人的姓名、掛號(hào)的科室、編號(hào)等。由于所有的掛號(hào)事務(wù)是作為同一種事務(wù)進(jìn)行處理的,因此,只需要在第1次事務(wù)請(qǐng)求時(shí),產(chǎn)生一次SQL語(yǔ)句的解析,生成和保存一個(gè)執(zhí)行計(jì)劃,以后所有掛號(hào)請(qǐng)求就都可以復(fù)用這個(gè)執(zhí)行計(jì)劃。情況1的資源開銷我們可以描述為:CPU開銷為1,內(nèi)存開銷為1。
情況2:門診程序的SQL代碼未采用綁定變量的方式
這個(gè)時(shí)候數(shù)據(jù)庫(kù)系統(tǒng)是無(wú)法分辨是否是同一種事務(wù)處理方式的。所以每一次掛號(hào)請(qǐng)求都會(huì)進(jìn)行SQL解析,產(chǎn)生一條新的執(zhí)行計(jì)劃。如此,每天10000次掛號(hào)請(qǐng)求,則每次數(shù)據(jù)庫(kù)系統(tǒng)都需生成一條新的執(zhí)行計(jì)劃,每一個(gè)執(zhí)行計(jì)劃都需要在內(nèi)存中找到地方存放,則情況2的資源開銷為:CPU開銷為10000,內(nèi)存開銷為10000。
即在這個(gè)例子中,未使用綁定變量的情況下,CPU和內(nèi)存的開銷約為使用綁定變量時(shí)的10000倍。
問(wèn)題處置建議
對(duì)于此類解析過(guò)量問(wèn)題,通常有如下建議:
由于解析過(guò)量的問(wèn)題是SQL語(yǔ)句中未使用綁定變量引起的,所以此類問(wèn)題主要由系統(tǒng)軟件開發(fā)人員或開發(fā)廠商進(jìn)行處理,針對(duì)程序質(zhì)量進(jìn)行針對(duì)性的改進(jìn),具體建議如下:
(1)業(yè)務(wù)已進(jìn)入生產(chǎn)運(yùn)營(yíng)階段:由于整體修改程序代碼的成本較高,建議采取折中方法,采用工具軟件(如全景軟件)或人工命令篩選出解析頻繁度TOP5的語(yǔ)句(具體方法請(qǐng)參考下列真實(shí)案例)只對(duì)這些TOP語(yǔ)句進(jìn)行綁定變量的優(yōu)化,從而實(shí)現(xiàn)在工作量盡量少的情況下,最大程度的改善解析過(guò)量造成的系統(tǒng)資源開銷過(guò)高情況。如果TOP5語(yǔ)句優(yōu)化后開銷仍然較高,可以再依次選取TOP6以后的更多語(yǔ)句進(jìn)行優(yōu)化,直至資源開銷變?yōu)檎!?/p>
(2)業(yè)務(wù)尚處在研發(fā)測(cè)試階段:督促相關(guān)的開發(fā)者,建立嚴(yán)格的開發(fā)規(guī)范,業(yè)務(wù)軟件的代碼書寫要求應(yīng)嚴(yán)格使用綁定變量;開發(fā)完成后,進(jìn)行嚴(yán)格的測(cè)試,可配合使用全景軟件,發(fā)現(xiàn)代碼中存在的硬解析問(wèn)題,減少系統(tǒng)上線后產(chǎn)生的性能問(wèn)題,降低上線后修改程序的成本。
使用全景軟件發(fā)現(xiàn)及定位解析過(guò)量的問(wèn)題
真實(shí)案例
(1)問(wèn)題發(fā)現(xiàn):登錄全景軟件——問(wèn)題溯源模塊,發(fā)現(xiàn)2021年11月存在大量的解析過(guò)量問(wèn)題,由于此問(wèn)題是存在程序代碼中的問(wèn)題,點(diǎn)擊其中某次信息查看即可,例如查看2021-11-09 9:00解析過(guò)量問(wèn)題塊。
上圖藍(lán)色矩形即代表著檢測(cè)到解析過(guò)量事件的時(shí)間區(qū)間,從中我們可以看到一個(gè)規(guī)律,因?yàn)榻馕鲞^(guò)量屬于程序代碼質(zhì)量問(wèn)題,因此只要程序運(yùn)行,就會(huì)受到該問(wèn)題的影響,所以對(duì)存在解析過(guò)量問(wèn)題的業(yè)務(wù)程序,往往在業(yè)務(wù)的高峰,嚴(yán)重的甚至是每天的整個(gè)業(yè)務(wù)運(yùn)行時(shí)段,都會(huì)不斷報(bào)告出現(xiàn)解析過(guò)量事件。
(2)查看詳細(xì)信息:通過(guò)點(diǎn)擊問(wèn)題,查看SQL文本,我們以解析頻繁度和總執(zhí)行時(shí)間兩個(gè)維度進(jìn)行降序排列,得到TOP10 解析過(guò)量SQL,以第一個(gè)語(yǔ)句為例,該語(yǔ)句為“select * from OUTPATIENT_Record where 唯一標(biāo)識(shí)=000375177400.6”該語(yǔ)句為業(yè)務(wù)系統(tǒng)(本例為電子病歷系統(tǒng))頻繁執(zhí)行的一條語(yǔ)句,該查詢語(yǔ)句的where子句未使用綁定變量,會(huì)造成CPU開銷增加,進(jìn)而影響整個(gè)業(yè)務(wù)系統(tǒng)的性能。
建議先從解析頻繁度TOP5的語(yǔ)句開始優(yōu)化,即由綁定常量,改為綁定變量
下期分享
醫(yī)院業(yè)務(wù)軟件健康管理實(shí)戰(zhàn)案例分享(四)
---關(guān)鍵字段未使用索引問(wèn)題返回搜狐,查看更多
責(zé)任編輯: