性能問(wèn)題應(yīng)該從系統(tǒng)設(shè)計(jì)時(shí)期開始考慮,并延續(xù)到系統(tǒng)的生命期終止之時(shí)。 具有可伸縮性的系統(tǒng)是指當(dāng)系統(tǒng)的負(fù)載增加一倍,系統(tǒng)需要的資源也同樣增加一倍。說(shuō)起來(lái)簡(jiǎn)單,但在現(xiàn)實(shí)環(huán)境中確難以做到。由于管理并發(fā)用戶的開銷的增長(zhǎng)、鎖事務(wù)的增長(zhǎng)、一致性讀負(fù)載的增加、操作系統(tǒng)負(fù)載的增加、低效的SQL或索引設(shè)計(jì)導(dǎo)致的過(guò)高的I/O等等因素,會(huì)導(dǎo)致系統(tǒng)資源的消耗的增長(zhǎng)遠(yuǎn)大于一倍。 破壞可伸縮性的因素:
1.低效的應(yīng)用程序設(shè)計(jì)、實(shí)施和配置
2.硬件部分的規(guī)模不合適
3.軟件部分的限制
4.硬件部分的限制
系統(tǒng)的結(jié)構(gòu)可分為硬件和軟件兩部分:
硬件部分包括:CPU、內(nèi)存、I/O子系統(tǒng)和網(wǎng)絡(luò)模塊。
軟件部分包括:管理用戶接口、實(shí)現(xiàn)商業(yè)邏輯、管理用戶請(qǐng)求和資源分配、管理數(shù)據(jù)和事務(wù)。
在設(shè)計(jì)系統(tǒng)時(shí),應(yīng)該考慮以下幾個(gè)問(wèn)題:
系統(tǒng)將支持多少用戶?
用戶的交互方式是什么?
用戶所處的位置?
網(wǎng)絡(luò)的速度怎樣?
用戶將訪問(wèn)多少數(shù)據(jù)?有多少數(shù)據(jù)是只讀訪問(wèn)?
用戶對(duì)響應(yīng)時(shí)間的要求?
用戶是否需要24小時(shí)服務(wù)?
是否所有的修改需要實(shí)時(shí)完成?
應(yīng)用程序設(shè)計(jì)原則:
設(shè)計(jì)簡(jiǎn)單性原則:
1.如果表的設(shè)計(jì)復(fù)雜到?jīng)]有人能夠完全的理解,那么表的設(shè)計(jì)可能是比較差的。
2.如果SQL語(yǔ)句過(guò)長(zhǎng)以致于優(yōu)化程序無(wú)法優(yōu)化該語(yǔ)句,那么SQL語(yǔ)句的設(shè)計(jì)、事務(wù)和表的設(shè)計(jì)一定存在問(wèn)題。
3.如果表的相同列上被重復(fù)索引,那么索引的設(shè)計(jì)可能是有問(wèn)題的。
4.如果提交的查詢沒(méi)有限定,以致無(wú)法迅速的將結(jié)果返回給在線用戶,那么用戶接口或事務(wù)的設(shè)計(jì)是有問(wèn)題的。
5.如果數(shù)據(jù)庫(kù)的調(diào)用被許多層軟件從應(yīng)用邏輯中抽象出來(lái),那么,軟件開發(fā)的方法可能存在問(wèn)題。
數(shù)據(jù)建模:應(yīng)當(dāng)注意,不要在非核心數(shù)據(jù)單元上花費(fèi)過(guò)多的時(shí)間。
表和索引的設(shè)計(jì):選擇合適的列進(jìn)行索引、選擇索引類型、注意索引的代價(jià)、關(guān)注索引中列的順序。
一個(gè)表上如果有3個(gè)索引,那么當(dāng)進(jìn)行INSERT/UPDATE/DELETE操作時(shí),會(huì)比不帶索引的表慢大約10倍。
組合索引中,選擇性高的列在前查詢時(shí)需要的I/O更少。選擇性低的列在前,有助于代排序操作的查詢。
SQL執(zhí)行效率:
數(shù)據(jù)庫(kù)連接管理:應(yīng)避免沒(méi)有必要的過(guò)多連接。
數(shù)據(jù)庫(kù)游標(biāo)管理:使用cursor和綁定變量,盡量避免硬分析,較少軟分析。
硬分析:sql語(yǔ)句第一次提交,并在共享池中無(wú)法找到。
軟分析:sql語(yǔ)句第一次提交,但是可以在共享池中找到相同的語(yǔ)句。
實(shí)施新的應(yīng)用程序:
切換方式包括兩種:Big Bang Approach(所有用戶一次性轉(zhuǎn)移到新的系統(tǒng)上)和Trickle Approach(用戶分多次轉(zhuǎn)移到新的系統(tǒng)上)。
性能清單列表:
1.設(shè)置MAXINSTANCES, MAXDATAFILES,MAXLOGFILES,MAXLOGMEMBERS和 MAXLOGHISTORY的值高于預(yù)期值。避免系統(tǒng)的增長(zhǎng)導(dǎo)致必須重建控制文件。
2.設(shè)置BLOCK SIZE和優(yōu)化模式與開發(fā)環(huán)境中相同。如果測(cè)試環(huán)境中的所有SQL語(yǔ)句的執(zhí)行計(jì)劃都是正確的,可以測(cè)試環(huán)境中的統(tǒng)計(jì)信息導(dǎo)入到正式庫(kù)中。
3.盡量少修改初始化參數(shù)。除了SGA的組成部分和歸檔目錄的設(shè)置,其他初始化參數(shù)盡量保持默認(rèn)值,可以為以后性能優(yōu)化留下一定的余地。
4.通過(guò)設(shè)置數(shù)據(jù)庫(kù)對(duì)象的存儲(chǔ)參數(shù)來(lái)管理BLOCK的爭(zhēng)用。
5.所有的sql語(yǔ)句應(yīng)該被優(yōu)化。
6.驗(yàn)證中間層軟件和程序采用高效的方式連接數(shù)據(jù)庫(kù)。
7.驗(yàn)證sql語(yǔ)句有效的利用游標(biāo)。
8.確認(rèn)所有方案的對(duì)象從開發(fā)環(huán)境移植到了產(chǎn)品數(shù)據(jù)庫(kù)中。
9.一旦完成系統(tǒng)的切換,建立數(shù)據(jù)庫(kù)和操作系統(tǒng)統(tǒng)計(jì)信息的基線。
10.發(fā)現(xiàn)最先出現(xiàn)的瓶頸。
|