周勇
同濟(jì)大學(xué)軟件學(xué)院,上海 201804
ASE(Adaptive Server Enterprise) 是Sybase公司的性能優(yōu)化的智能型數(shù)據(jù)庫管理系統(tǒng)。作為企業(yè)級(jí)關(guān)系型數(shù)據(jù)庫的典型代表,ASE提供了強(qiáng)大的聯(lián)機(jī)事務(wù)處理能力和部分決策支持功能,非常適合于任務(wù)關(guān)鍵型及交易密集型應(yīng)用。ASE大多運(yùn)行在世界級(jí)證券公司、銀行的關(guān)鍵核心系統(tǒng)中,如華爾街證券交易。選用ASE為數(shù)據(jù)庫的應(yīng)用系統(tǒng)的規(guī)模比較大,所以效率就尤為重要。如何設(shè)計(jì)一個(gè)能夠滿足用戶當(dāng)前與可預(yù)見的未來的各項(xiàng)應(yīng)用要求、性能良好的數(shù)據(jù)庫成為數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計(jì)中的一個(gè)核心問題。
性能是衡量一個(gè)應(yīng)用程序或在同一環(huán)境下運(yùn)行的多個(gè)應(yīng)用程序的效率的尺度。性能通常以響應(yīng)時(shí)間和吞吐量來衡量。ASE數(shù)據(jù)庫的優(yōu)化主要就是指通過對(duì)響應(yīng)時(shí)間、吞吐量、硬件、及其運(yùn)行的操作系統(tǒng)和應(yīng)用程序的優(yōu)化來避免存儲(chǔ)器I/0瓶頸、提高CPU利用率和減少資源的競爭。但是我們不能用絕對(duì)的數(shù)量級(jí)指標(biāo)來定義ASE數(shù)據(jù)庫的優(yōu)化。然而,我們可以用優(yōu)化前后數(shù)據(jù)庫的各種性能指標(biāo)的對(duì)比來衡量數(shù)據(jù)庫優(yōu)化的結(jié)果。特別是SQL語句的執(zhí)行速度,SQL語句帶來的系統(tǒng)負(fù)擔(dān),應(yīng)用的響應(yīng)速度。因此,數(shù)據(jù)庫實(shí)例級(jí)的調(diào)整,大多用來解決數(shù)據(jù)庫結(jié)構(gòu)性故障,相應(yīng)的也能解決因?yàn)榻Y(jié)構(gòu)性故障帶來的普遍性的性能問題。然而我們注意到,用戶所真正關(guān)心的,切身感受到的執(zhí)行程序響應(yīng)慢的問題往往是不良的SQL語句,過期的統(tǒng)計(jì)數(shù)據(jù)和其導(dǎo)致的不良的執(zhí)行計(jì)劃,不良的數(shù)據(jù)表結(jié)構(gòu),不良的應(yīng)用同步鎖造成的。
高性能的CPU為數(shù)據(jù)庫提供高承載和吞吐能力,來確保充分的I/O并行性,以支持大容量的并發(fā)事件;配置管家任務(wù)以提高CPU 利用率;足夠的內(nèi)存,以支持大量并發(fā)用戶所需的緩沖池、代理程序和其他共享內(nèi)存對(duì)象;以及足夠大的網(wǎng)絡(luò)帶寬以支持工作負(fù)載。
數(shù)據(jù)庫物理文件及邏輯對(duì)象的合理分布,將影響數(shù)據(jù)庫的讀寫速度。優(yōu)秀的存儲(chǔ)結(jié)構(gòu)和合理的存取路徑可以使系統(tǒng)在開銷最小的情況下達(dá)到最佳性能。例如,把一個(gè)表放在某個(gè)物理設(shè)備上,再通過SYBASE ASE段把它的非簇集索引放在一個(gè)不同的物理設(shè)備上,這樣能提高性能。尤其是系統(tǒng)采用了多個(gè)磁盤陣列和數(shù)據(jù)分離技術(shù)的情況下,這樣做的好處更加明顯。還可以通過靜態(tài)數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù)相分離、將大的對(duì)象分割存放在多個(gè)磁盤上等措施來加快訪問速度、減少I/O競爭。對(duì)DOL表和APL表的使用要合理,以減少鎖定在存儲(chǔ)上的不良影響。
ASE雖然是自適應(yīng)服務(wù)的,但是一個(gè)性能優(yōu)良、可靠的操作系統(tǒng)能夠適用于 Adaptive Server 的文件系統(tǒng),CPU 可用性和分配到 Adaptive Server,從而使ASE的各項(xiàng)功能發(fā)揮的淋漓盡致。若沒有優(yōu)良的操作系統(tǒng)來保證ASE的運(yùn)行效率,那么數(shù)據(jù)庫的一切調(diào)整都將失去了意義。
查詢的處理大都是基于SQL語句,SQL是用于存取數(shù)據(jù)的根本手段,因此,SQL語句的執(zhí)行效率對(duì)數(shù)據(jù)庫系統(tǒng)的性能起著決定性影響。高效的SQL語句能夠成倍地提高應(yīng)用程序能力。一個(gè)正確設(shè)計(jì)的數(shù)據(jù)庫,由于不合理的程序設(shè)計(jì)及SQL語句,會(huì)帶來大多數(shù)性能問題。所以,要根據(jù)數(shù)據(jù)操作類型對(duì)SQL語句進(jìn)行分類,還應(yīng)該對(duì)數(shù)據(jù)操作進(jìn)行跟蹤,找到那些最耗費(fèi)資源和時(shí)間的操作,并對(duì)這些操作進(jìn)行分析,找到優(yōu)化的辦法。
網(wǎng)絡(luò)層是與將用戶連接到 Adaptive Server 的一個(gè)網(wǎng)絡(luò)或多個(gè)網(wǎng)絡(luò)相關(guān)。實(shí)際上,所有 Adaptive Server 用戶都可通過網(wǎng)絡(luò)訪問其數(shù)據(jù)。網(wǎng)絡(luò)通信量,網(wǎng)絡(luò)瓶頸和網(wǎng)絡(luò)速度,都會(huì)造成Adaptive Server 使用網(wǎng)絡(luò)服務(wù)的效率低下。
在數(shù)據(jù)庫中,數(shù)據(jù)都是存儲(chǔ)在表空間中,所以對(duì)數(shù)據(jù)統(tǒng)計(jì)和分析的優(yōu)化首先要對(duì)表空間設(shè)計(jì)和管理的優(yōu)化。一般來說ASE表空間所跨的驅(qū)動(dòng)器越多、越快,則潛在的性能將越好。在下面3種情況下,使用多個(gè)表空間就是很有用:1)控制I/O,如果這些表空間可以位于不同的驅(qū)動(dòng)器上的話;2)使用大小不同的頁面;3)控制緩沖池。若ASE數(shù)據(jù)庫數(shù)據(jù)統(tǒng)計(jì)和分析系統(tǒng)建立時(shí),設(shè)計(jì)良好的數(shù)據(jù)庫管理表空間能夠提供更好的性能。如果要以一種連續(xù)的方式來訪問數(shù)據(jù),那么采用更大的頁面大小可以獲得更好的性能;相反,如果對(duì)數(shù)據(jù)的訪問采用的是隨機(jī)方式,那么最好使用盡可能小的頁面
充足的內(nèi)存可減少磁盤I/O,因?yàn)閮?nèi)存訪問比磁盤訪問快很多,因此提高了性能。用戶發(fā)出查詢時(shí),數(shù)據(jù)和索引頁必須在內(nèi)存中,或被讀入內(nèi)存中。如果頁已駐留在內(nèi)存中,則 Adaptive Server 不需要執(zhí)行磁盤I/O。配置 Adaptive Server 時(shí),內(nèi)存是最重要的考慮因素。內(nèi)存被各種配置參數(shù)、過程高速緩存和數(shù)據(jù)高速緩存使用。正確設(shè)置配置參數(shù)和高速緩存的值是獲得良好系統(tǒng)性能的關(guān)鍵。合理分配內(nèi)存緩沖區(qū),可以大大加快數(shù)據(jù)查詢速度、減少系統(tǒng)I/O操作。比如在那些隨機(jī)訪問或者很少訪問的表之間共享一個(gè)緩沖池,就有可能將經(jīng)常訪問的行擠出到磁盤上,這樣就會(huì)影響系統(tǒng)的效率。所以對(duì)內(nèi)存緩沖區(qū)的合理設(shè)置,可以大大加快數(shù)據(jù)查詢速度以及內(nèi)存區(qū)的命中率,提高系統(tǒng)性能。
索引是提高數(shù)據(jù)庫性能的最重要的物理設(shè)計(jì)元素:1)索引有助于避免表掃描。無需讀取許多數(shù)據(jù)頁,少數(shù)幾個(gè)索引頁和數(shù)據(jù)頁就可以滿足眾多查詢要求;2)對(duì)于某些查詢,無需訪問數(shù)據(jù)行即可從非聚簇索引中檢索到數(shù)據(jù);3)聚簇索引可以隨機(jī)化數(shù)據(jù)插入,避免在表的最后一頁插入熱點(diǎn);4)如果索引順序與order by子句中的列順序相匹配,索引可有助于避免排序;5)對(duì)于多數(shù)分區(qū)表,可以創(chuàng)建具有一個(gè)索引樹的全局索引以覆蓋整個(gè)表;也可以創(chuàng)建具有多個(gè)索引樹的本地索引,其中每個(gè)樹覆蓋一個(gè)表分區(qū)。
雖然索引可加速數(shù)據(jù)檢索,但由于多數(shù)數(shù)據(jù)更改要求更新索引,因此,它們會(huì)減慢數(shù)據(jù)修改的速度。要進(jìn)行最佳索引編制,要求我們必須了解以下幾點(diǎn):1)訪問非索引堆表、帶聚簇索引表和帶非聚簇索引表的查詢行為;2)在服務(wù)器上運(yùn)行的混合查詢;3)分區(qū)表上本地和全局索引的相對(duì)優(yōu)勢(shì);4)Adaptive Server 優(yōu)化程序。
良好的SQL語句可以被數(shù)據(jù)庫重復(fù)使用從而減少分析時(shí)間、改善一個(gè)系統(tǒng)的性能、對(duì)提高數(shù)據(jù)庫內(nèi)存區(qū)的命中率、減少I/O訪問等有著非常重要的意義。根據(jù)SYBASE ASE的預(yù)處理規(guī)則,SQL語句的撰寫有如下幾個(gè)優(yōu)化原則:表達(dá)式寫在計(jì)算符號(hào)的右邊;在可能的情況下,提供更多的查詢條件;盡量使用>=替代>,比如:>10,建議書寫為>=11;按照索引的順序書寫查詢條件。通??梢圆捎孟旅娣椒▋?yōu)化SQL對(duì)數(shù)據(jù)操作的表現(xiàn)。
1)模糊匹配的避免。雖然LIKE關(guān)鍵字支持通配符匹配,技術(shù)上稱為正則表達(dá)式。但這種匹配特別耗費(fèi)時(shí)間,盡量避免使用模糊匹配;
2)邏輯表達(dá)式的等價(jià)變換。如將多個(gè)OR連接的表達(dá)式轉(zhuǎn)化為ANY表達(dá)式;將ANY或ALL轉(zhuǎn)化為簡單的比較表達(dá)式;將BETWEEN…AND轉(zhuǎn)化為AND連接的表達(dá)式;將IN謂詞表達(dá)式轉(zhuǎn)換為OR連接的謂詞表達(dá)式;
3)使用臨時(shí)表空間,把表的子集在臨時(shí)表中進(jìn)行排序,有助于避免多重排序操作。為了加速SQL查詢至少應(yīng)該創(chuàng)建一個(gè)表空間供臨時(shí)段單獨(dú)使用;
4)限制動(dòng)態(tài)SQL的使用,雖然動(dòng)態(tài)SQL很好用,但是即使在SQL共享池中有一個(gè)完全相同的查詢值,動(dòng)態(tài)SQL也會(huì)重新進(jìn)行語法分析;
5)盡量使用相同的或非常類似的SQL語句進(jìn)行查詢,這樣不僅充分利用內(nèi)存中的已經(jīng)分析的語法樹,還能使要查詢的數(shù)據(jù)在緩沖池中命中的可能性也會(huì)大大增加。
異步預(yù)取通過預(yù)測某些為數(shù)據(jù)庫活動(dòng)明確定義的類所需的頁(其訪問模式是可預(yù)測的)來改善性能。在查詢需要這些頁之前發(fā)出對(duì)它們的 I/O 請(qǐng)求,這樣大多數(shù)的頁在查詢處理需要訪問它們時(shí)已經(jīng)處于高速緩存中。為緩沖池選擇最佳池大小和預(yù)取百分比是通過異步預(yù)取獲得性能改善的關(guān)鍵。當(dāng)多個(gè)應(yīng)用程序同時(shí)運(yùn)行時(shí),一個(gè)經(jīng)良好調(diào)優(yōu)的預(yù)取系統(tǒng)可平衡緩沖池大小和預(yù)取限制,從而實(shí)現(xiàn)以下目標(biāo):1)改善系統(tǒng)吞吐量;2)提高使用異步預(yù)取的應(yīng)用程序的性能;3)不降低未使用異步預(yù)取的應(yīng)用程序的性能。
數(shù)據(jù)庫設(shè)計(jì)過程中一般會(huì)受到多種因素的制約,有些要求往往是彼此矛盾的。因此,設(shè)計(jì)結(jié)果常常是有得有失。所以設(shè)計(jì)者必須根據(jù)相應(yīng)的實(shí)際情況,綜合應(yīng)用以上技術(shù),在基本合理的總體設(shè)計(jì)的基礎(chǔ)上,做一些優(yōu)化調(diào)整,力求最大限度地滿足用戶各種各樣的需求,實(shí)現(xiàn)數(shù)據(jù)庫的優(yōu)化設(shè)計(jì)。影響性能的因素是如此的多,而實(shí)際的應(yīng)用又各不相同,設(shè)計(jì)出一個(gè)通用的優(yōu)化方案是不現(xiàn)實(shí)的,因此在實(shí)際系統(tǒng)開發(fā)和維護(hù)的過程中必須針對(duì)具體運(yùn)行的情況,不斷加以調(diào)整。
[1]周輝君.數(shù)據(jù)庫系統(tǒng)優(yōu)化方法研究[J].科技信息:科學(xué)教研,2008(17).
[2]袁長河.Sybase SQLserver性能優(yōu)化技術(shù)初探[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2001.
[3]劉斌,湯曉兵,劉震,李盛恩.基于數(shù)據(jù)庫優(yōu)化技術(shù)的查詢應(yīng)用[J].信息技術(shù)與信息化,2008(5).