楊俊生
大連理工大學(xué)城市學(xué)院計(jì)算機(jī)工程分院,遼寧大連 116600
通常一個(gè)應(yīng)用軟件系統(tǒng)中涉及網(wǎng)絡(luò)系統(tǒng)、計(jì)算機(jī)系統(tǒng)、應(yīng)用軟件系統(tǒng)以及數(shù)據(jù)庫系統(tǒng)。這些系統(tǒng)需要高效、協(xié)調(diào)一致地工作,方能給客戶提供良好的服務(wù),客戶對(duì)系統(tǒng)的滿意度很大程度上取決于客戶的體驗(yàn),包括系統(tǒng)界面友好、簡(jiǎn)單易用、健壯可靠、安全高效等。
當(dāng)系統(tǒng)在并發(fā)量不高的情況下,上述的用戶體驗(yàn)大都可以滿足,但當(dāng)并發(fā)量持續(xù)增加時(shí),系統(tǒng)整體性能逐漸走低,數(shù)據(jù)庫系統(tǒng)將成為主要的性能瓶頸。
當(dāng)前系統(tǒng)硬件水平發(fā)展很快,CPU運(yùn)算速度、內(nèi)存速度容量、網(wǎng)絡(luò)速度等都在大幅度提高,通過更換硬件設(shè)備提高性能無疑是一種解決辦法,但系統(tǒng)內(nèi)部問題卻容易被忽視,系統(tǒng)性能問題很多來自于系統(tǒng)設(shè)計(jì)本身。
圖1 客戶執(zhí)行操作的內(nèi)部處理
當(dāng)前的主流應(yīng)用軟件體系結(jié)構(gòu)為B/S結(jié)構(gòu),客戶在瀏覽器中進(jìn)行一項(xiàng)操作,信息的傳遞過程是:
1)提交請(qǐng)求到應(yīng)用服務(wù)器;
2)應(yīng)用服務(wù)器接收并處理信息;
3)應(yīng)用服務(wù)器訪問數(shù)據(jù)庫系統(tǒng);
4)數(shù)據(jù)庫系統(tǒng)處理數(shù)據(jù);
5)數(shù)據(jù)庫系統(tǒng)返回處理結(jié)果給應(yīng)用服務(wù)器;
6)應(yīng)用服務(wù)器處理返回結(jié)果;
7)應(yīng)用服務(wù)器將最終顯示信息傳遞到瀏覽器。
客戶執(zhí)行操作的內(nèi)部處理參見圖1所示。
客戶執(zhí)行一項(xiàng)操作的響應(yīng)時(shí)間是上述7個(gè)步驟的執(zhí)行時(shí)間之和,其中4部分是網(wǎng)絡(luò)傳輸時(shí)間,2部分是應(yīng)用服務(wù)器處理時(shí)間,1部分是數(shù)據(jù)庫處理時(shí)間。
在這幾個(gè)部分中真正與數(shù)據(jù)庫系統(tǒng)相關(guān)的操作時(shí)間是應(yīng)用服務(wù)器與數(shù)據(jù)庫系統(tǒng)間的網(wǎng)絡(luò)傳輸時(shí)間和數(shù)據(jù)庫系統(tǒng)內(nèi)部的處理時(shí)間。
根據(jù)上述分析得知數(shù)據(jù)庫系統(tǒng)響應(yīng)時(shí)間主要集中在網(wǎng)絡(luò)傳輸和數(shù)據(jù)庫系統(tǒng)內(nèi)部處理時(shí)間,針對(duì)這兩種情況我們分別具體分析。
應(yīng)用服務(wù)器和數(shù)據(jù)庫系統(tǒng)之間的數(shù)據(jù)傳輸時(shí)間取決于傳輸?shù)臄?shù)據(jù)量和次數(shù),對(duì)于定量的數(shù)據(jù),傳輸?shù)拇螖?shù)將主要決定傳輸需要的總時(shí)間。
一次數(shù)據(jù)傳輸包括發(fā)送端準(zhǔn)備數(shù)據(jù)時(shí)間、數(shù)據(jù)在網(wǎng)絡(luò)中傳輸時(shí)間、接收端接收數(shù)據(jù)時(shí)間、接收端返回響應(yīng)數(shù)據(jù)在網(wǎng)絡(luò)中傳輸時(shí)間。
例如向數(shù)據(jù)庫表中連續(xù)插入10 000條記錄,兩種選擇,第一種逐條插入,第二種批量插入,以下是在Oracle10g版本中測(cè)試的跟蹤信息,圖2是逐條插入時(shí)的跟蹤信息,圖3是每1 000條插入一次的跟蹤信息。
圖2 逐條插入網(wǎng)絡(luò)時(shí)間
圖3 批量插入網(wǎng)絡(luò)時(shí)間
圖2顯示在網(wǎng)絡(luò)中傳輸數(shù)據(jù)時(shí)等待次數(shù)累計(jì)20 000次、累計(jì)時(shí)間3.12秒,圖3顯示等待次數(shù)累計(jì)20次、累計(jì)時(shí)間0.04秒,可見批處理方式可顯著降低網(wǎng)絡(luò)傳輸所消耗的時(shí)間。
數(shù)據(jù)庫的批處理不僅可用于向數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù),也可以用于從數(shù)據(jù)中讀取數(shù)據(jù),圖4顯示逐條讀取數(shù)據(jù)的跟蹤信息,圖5顯示每次讀取1 000條的跟蹤信息。
圖4 逐條讀取網(wǎng)絡(luò)時(shí)間
圖5 批量讀取網(wǎng)絡(luò)時(shí)間
圖4顯示網(wǎng)絡(luò)中傳輸數(shù)據(jù)時(shí)等待次數(shù)累計(jì)20 000次、累計(jì)時(shí)間2.69s,圖5顯示等待次數(shù)累計(jì)20次,累計(jì)時(shí)間0.18s。上述試驗(yàn)證明大數(shù)據(jù)量操作時(shí),批處理方式可大幅度提高效率。
圖6 硬解析
圖7 軟解析
圖6顯示硬解析10 000次,累計(jì)時(shí)間消耗10.45秒,圖7顯示只發(fā)生1次硬解析,消耗時(shí)間幾近為0。軟解析的實(shí)現(xiàn)與應(yīng)用開發(fā)中SQL語句的編寫直接相關(guān),例如:“select name from tbluser where userid=1”和“select name from tbluser where userid=2”兩條語句,他們的差別在于查詢條件的值不同,又比如“SELECT name FROM tbluser where userid=1”和“select name from tbluser where userid=1”兩條語句,他們的差別在于關(guān)鍵字select和from的大小寫不同,這些對(duì)于數(shù)據(jù)庫來說可能都是不同的SQL語句。
Oracle數(shù)據(jù)庫中保存SQL解析信息時(shí)以整個(gè)SQL文本計(jì)算的哈希值作為鍵值,SQL文本的細(xì)微差異都會(huì)導(dǎo)致硬解析發(fā)生。
進(jìn)行軟件開發(fā)時(shí)需要定義SQL開發(fā)規(guī)范,規(guī)定SQL文本中的大小寫限制、空格多少等,其次要使用預(yù)編譯語句(比如jdbc中使用PreparedStatement),避免SQL語句中直接寫查詢條件值,應(yīng)由變量替代,以提高軟解析率。
通過減少讀寫次數(shù)降低IO響應(yīng)時(shí)間。
數(shù)據(jù)庫的讀操作分為物理讀和邏輯讀兩種,物理讀指從磁盤讀取數(shù)據(jù),邏輯讀指從內(nèi)存獲取數(shù)據(jù)。在計(jì)算機(jī)的存儲(chǔ)結(jié)構(gòu)中,磁盤讀寫的速度遠(yuǎn)低于內(nèi)存讀寫速度,為降低讀操作響應(yīng)時(shí)間,要盡可能減少讀,更要盡可能減少磁盤讀,減少讀但不能避免讀。合理利用索引結(jié)構(gòu)定位數(shù)據(jù)可大大降低讀的數(shù)據(jù)量,圖8顯示有索引情況下讀10000行數(shù)據(jù)的統(tǒng)計(jì)信息。
圖8 有索引的數(shù)據(jù)讀
圖7和圖8的數(shù)據(jù)都來源于查詢同一數(shù)據(jù)庫表的10000行記錄,區(qū)別在于圖8顯示表中有索引時(shí)的查詢統(tǒng)計(jì)信息。分析這兩個(gè)圖中Fetch行中query列的數(shù)據(jù)量可知,沒有索引時(shí)查詢走全表掃描,讀10000行數(shù)據(jù)累計(jì)讀680000塊數(shù)據(jù),平均讀每行數(shù)據(jù)要掃描68塊才讀到需要的數(shù)據(jù);有索引情況下讀10000行數(shù)據(jù)累計(jì)讀30020塊數(shù)據(jù),平均讀每行數(shù)據(jù)僅掃描3.002塊,首先查找索引獲得數(shù)據(jù)的ROWID,再根據(jù)ROWID讀數(shù)據(jù)行,從而避免了全表掃描。減少物理讀的有效措施是提高緩存存儲(chǔ)量,使用內(nèi)存緩存讀取過的數(shù)據(jù),使之后的數(shù)據(jù)讀取直接從內(nèi)存中獲得。
數(shù)據(jù)庫的寫操作由后臺(tái)進(jìn)程完成,數(shù)據(jù)庫系統(tǒng)為提高性能,都是先寫日志文件,再根據(jù)觸發(fā)條件寫數(shù)據(jù)文件。這里與SQL編寫相關(guān)的是日志文件的寫操作,提交(COMMIT)語句直接觸發(fā)日志文件的寫操作,每執(zhí)行一次提交操作,數(shù)據(jù)庫會(huì)立即寫日志文件,這時(shí)就是一次物理寫,物理寫過于頻繁會(huì)大大降低系統(tǒng)性能,這時(shí)可考慮批量操作后再提交,比如向表中插入10 000數(shù)據(jù),可每插入1 000行提交1次,避免每插入1行提交1次。
本文在分析軟件系統(tǒng)中數(shù)據(jù)庫系統(tǒng)的操作響應(yīng)時(shí)間的基礎(chǔ)上,結(jié)合實(shí)際測(cè)試給出軟件開發(fā)過程中可對(duì)數(shù)據(jù)庫性能進(jìn)行優(yōu)化的具體措施。這些措施已經(jīng)實(shí)施在基金項(xiàng)目中,系統(tǒng)性能得到了大幅度提高。
[1]吳越勝,張耀輝.Oracle9i數(shù)據(jù)庫性能調(diào)整與優(yōu)化[M].清華大學(xué)出版社,2005.
[2]蔣海鷗,李浩,金海.未公開的Oracle數(shù)據(jù)庫秘密[M].人民郵電出版社,2011.
[3]蓋國強(qiáng),馮春培,葉梁,馮大輝.Oracle數(shù)據(jù)庫性能優(yōu)化[M].人民郵電出版社,2005.
[4]童家旺,胡怡文,馮大輝.Oracle性能診斷藝術(shù)[M].人民郵電出版,2009.