付文哲 韓震 司玉杰
摘要:科技的發(fā)展使得互聯(lián)網(wǎng)技術(shù)在信息管理工作中的應(yīng)用逐漸廣泛,為了能夠使數(shù)據(jù)庫的運(yùn)行效率大幅提升,減少系統(tǒng)運(yùn)行中所消耗的資源,就需要從多方面入手,針對性地對數(shù)據(jù)庫的運(yùn)行給出優(yōu)化方案,綜合提升數(shù)據(jù)庫的性能。本文主要對處理數(shù)據(jù)庫的優(yōu)化設(shè)計進(jìn)行研究。
關(guān)鍵詞:數(shù)據(jù)庫;優(yōu)化處理;性能優(yōu)化
中圖分類號:TP311? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)32-0028-02
在數(shù)據(jù)庫建立完成后,隨著時間的推移,數(shù)據(jù)庫內(nèi)的數(shù)據(jù)量會大幅度上升,數(shù)據(jù)庫的運(yùn)行效率難免會出現(xiàn)下降的情況,為了保證數(shù)據(jù)庫的正常運(yùn)行,避免數(shù)據(jù)庫影響系統(tǒng)的正常使用,可以選擇增加內(nèi)存的方式,但該方法成本較高,故而一般會選擇優(yōu)化數(shù)據(jù)庫來提升系統(tǒng)性能。
1 影響數(shù)據(jù)庫運(yùn)行速率的主要原因
1) 暫時性數(shù)據(jù)處理任務(wù)量過大
在數(shù)據(jù)庫的運(yùn)轉(zhuǎn)過程中,備份、存儲、命令執(zhí)行、數(shù)據(jù)回遷、視圖同步等各項工作在進(jìn)行時,服務(wù)器的工作壓力較大,此時I/O出現(xiàn)沖突,整個系統(tǒng)的運(yùn)行速率下降。
2) CPU占用過高
CPU是數(shù)據(jù)庫中的一個重要部分,當(dāng)某一個應(yīng)用或某一工作指令占據(jù)了大量的CPU時,數(shù)據(jù)庫的其他工作指令會運(yùn)行緩慢,使得數(shù)據(jù)庫的性能下降。一般來說低效SQL語句、重解析SQL語句、鎖沖突這些情況都會使得CPU的資源占用過高,引起數(shù)據(jù)庫的性能下降。
3) 內(nèi)存分配不恰當(dāng)
如果系統(tǒng)的內(nèi)存分配不合理,則Oracle用于記錄最近歷史數(shù)據(jù)的緩沖控件會減少,在操作較為頻繁的情況下,不斷地更換頁面或交換存儲內(nèi)容,則系統(tǒng)的I/O工作壓力增大,此時數(shù)據(jù)庫的性能下降。
4) Oracle配置不合理
對Oracle來說,一套Oracle后臺進(jìn)程和系統(tǒng)的一個對應(yīng)內(nèi)存區(qū)域共同組成一個Oracle實例,如果Oracle的配置不合理,則系統(tǒng)的性能也會受到影響,導(dǎo)致數(shù)據(jù)庫的性能下降。
5) 網(wǎng)速較慢
網(wǎng)速和系統(tǒng)的運(yùn)行速率有較大的關(guān)聯(lián),如果網(wǎng)絡(luò)的帶寬較低,則整個系統(tǒng)的運(yùn)行性能較差,如果網(wǎng)絡(luò)的帶寬非常低,還會對I/O負(fù)載量造成影響,網(wǎng)絡(luò)I/O的負(fù)載量也就相應(yīng)的增大,數(shù)據(jù)庫在運(yùn)行過程中的運(yùn)轉(zhuǎn)效率降低,響應(yīng)時間增加。
2 通過SQL優(yōu)化數(shù)據(jù)庫性能
SQL優(yōu)化指的是通過對數(shù)據(jù)庫內(nèi)的數(shù)據(jù)進(jìn)行定位、執(zhí)行、檢查、分析、改寫、再執(zhí)行來達(dá)到減少系統(tǒng)的資源消耗,進(jìn)而提升數(shù)據(jù)庫性能目的的一種手段。SQL語句的執(zhí)行情況直接決定了Oracle數(shù)據(jù)庫的運(yùn)行性能,SQL語句幾乎占據(jù)了數(shù)據(jù)庫80%的資源,這也說明了SQL語句優(yōu)化的重要性,因此需要對SQL語句進(jìn)行合理設(shè)計,通過提高SQL語句的執(zhí)行效率來提升數(shù)據(jù)庫的性能。在SQL優(yōu)化的過程中,需要對select語句進(jìn)行優(yōu)化,使select語句占用最少的硬件資源,同時通過最快的響應(yīng)速度來提升數(shù)據(jù)庫的響應(yīng)時間。在SQL優(yōu)化的過程中,應(yīng)該注意要高效利用索引這一工具,不可直接對大數(shù)據(jù)進(jìn)行全盤掃描,同時也可以通過臨時表來提升優(yōu)化效果,此外,一句SQL語句并不一定是優(yōu)化的最佳方案,過于復(fù)雜的SQL語句反而有弊無利,應(yīng)該在不影響系統(tǒng)查找準(zhǔn)確性的前提下,提升系統(tǒng)的響應(yīng)效率。
以對SQL進(jìn)行優(yōu)化為例,第一種方法,可以將索引的組合順序與用戶所查詢的順序盡量向一致性進(jìn)行排序,以此來完成SQL優(yōu)化。第二種方法,在SQL查詢時,避免使用“*”號,盡可能地使用一些確定的列名,例如避免使用“Select*From table”,可以使用“Select col1,col2,col3 from table”,通過更加準(zhǔn)確的查詢,來更加直接快速地確定所需的數(shù)據(jù)。通常在數(shù)據(jù)庫中查詢數(shù)據(jù)時,確定的列名可以使索引快速地對數(shù)據(jù)庫的準(zhǔn)確位置進(jìn)行掃描,相對于全盤掃描來說提升了反應(yīng)速度,如在查詢時使用“*”進(jìn)行搜索,則在搜索過程中會對無關(guān)緊要的數(shù)據(jù)區(qū)域進(jìn)行查詢,產(chǎn)生大量無用的數(shù)據(jù)傳輸,影響了網(wǎng)絡(luò)速度,降低了查詢效率。第三種方法,在查詢時應(yīng)該注意盡量減少復(fù)雜的連鎖查詢,復(fù)雜的連鎖查詢會使系統(tǒng)在查詢時難以高效率地完成真正所需要的查詢工作,影響數(shù)據(jù)庫的性能。如果在產(chǎn)品中有較多的“or”,則可以將查詢內(nèi)容分為數(shù)個更加簡單的單向查詢,將數(shù)個查詢內(nèi)容用“union”進(jìn)行連接,更有效地利用索引工具,進(jìn)而提升數(shù)據(jù)庫的響應(yīng)速度。第四種方法,在查詢復(fù)雜的SQL時,可以在最外層放置分頁語句,以此來提升查詢速率。
3 通過索引優(yōu)化數(shù)據(jù)庫性能
索引相當(dāng)于是數(shù)據(jù)庫的目錄,通過索引能將查找數(shù)據(jù)的范圍縮小,進(jìn)而提升查找速率,因此數(shù)據(jù)庫的索引是否能夠被正確使用直接影響到數(shù)據(jù)庫的性能,故而在使用過程中需要不斷地定期對數(shù)據(jù)庫的索引進(jìn)行檢查,刪除不必要的索引,按需增加新的索引,或者對索引進(jìn)行重構(gòu),以此來提升數(shù)據(jù)庫的性能。添加新的索引后,只需通過對索引進(jìn)行搜索就可以快速地獲取相關(guān)的數(shù)據(jù)內(nèi)容,因此需要定期添加新的索引。在掃描數(shù)據(jù)庫時,為了提升掃描速率,應(yīng)該確定掃描數(shù)據(jù)的具體位置,不可對全盤進(jìn)行掃描,而這時就需要給大表添加新的索引,通過索引的位置記錄來獲得數(shù)據(jù)的位置記錄,從而快速訪問相關(guān)的數(shù)據(jù),一般來說,如果在查詢過程中只需要某一小段字符,則可以在對應(yīng)的字符上建立新的索引,在再次訪問時,只需查找索引記錄就可返回數(shù)據(jù)內(nèi)容,訪問索引可以減少磁盤的讀寫次數(shù),從而提升系統(tǒng)的反應(yīng)速率,降低響應(yīng)時間。而且這種方式還不需要對數(shù)據(jù)表進(jìn)行查詢,單單通過索引就可直接得到查詢結(jié)果,因此操作較為簡單。同樣,如果大表中的歷史記錄較多,但記錄所返回的次數(shù)較少,則這種情況下也可以通過索引來快速地完成查詢指令,一般來說是通過檢索條件來建立新的索引,在SQL查詢時,可以通過新的索引來得到歷史記錄的地址,而且由于返回的次數(shù)較少,這也意味著在使用該種方式時邏輯讀少,可以快速地完成數(shù)據(jù)訪問工作。當(dāng)然在添加索引后,應(yīng)該盡量選擇聯(lián)合索引,聯(lián)合索引比多個索引的效率更高。
以刪除不必要的索引和對索引進(jìn)行重構(gòu)來優(yōu)化數(shù)據(jù)庫的性能為例,由于在系統(tǒng)運(yùn)行的過程中,一些索引所對應(yīng)的內(nèi)容可能已經(jīng)刪除,或有一些索引與對應(yīng)的數(shù)據(jù)并不符合,因此這些索引已經(jīng)沒有了對應(yīng)的存在價值,相反還會浪費(fèi)儲存空間,降低系統(tǒng)的運(yùn)行速率,甚至在某一些特定的環(huán)境下,這些沒有價值的索引還會導(dǎo)致系統(tǒng)的解析效率下降,影響數(shù)據(jù)庫的相關(guān)功能。因此可以對數(shù)據(jù)庫進(jìn)行30天的數(shù)據(jù)監(jiān)控,在30天后根據(jù)監(jiān)控的結(jié)果刪除系統(tǒng)中不必要的無用索引。目前數(shù)據(jù)庫的索引只可以進(jìn)行索引插入和索引刪除兩種操作,因此在內(nèi)容更新時,對索引進(jìn)行更新并不是傳統(tǒng)意義上的更新?lián)Q代,而是將對應(yīng)的舊記錄的位置標(biāo)記為刪除,在新的位置插入新的索引,這就意味著在索引更新的過程中,舊的索引并沒有被刪除,而是以另一種方式所存在,同時新的索引不斷增加,在不斷地更新?lián)Q代之后,系統(tǒng)中的索引關(guān)鍵字不斷增多,然而其中被標(biāo)記為刪除的無用索引并不存在相應(yīng)的價值,不僅占據(jù)了相應(yīng)的內(nèi)存,而且在對數(shù)據(jù)進(jìn)行搜集時,大量的索引反而需要數(shù)據(jù)庫對大量無用的索引進(jìn)行掃描,降低數(shù)據(jù)庫的處理效率。因此,如果系統(tǒng)的DML操作頻繁,則需要定期對索引進(jìn)行重構(gòu)。技術(shù)人員可以每年兩次對系統(tǒng)中的索引進(jìn)行整理,搜集出其中無用的索引刪除,如果有索引進(jìn)行過更新,則將舊的索引刪除,成立新的索引,以此來保證在降低內(nèi)存的條件下完成索引的真正更新?lián)Q代,釋放無效索引所占據(jù)的內(nèi)存,同時保持較少的索引量,提升數(shù)據(jù)庫的數(shù)據(jù)處理效率。
4 通過數(shù)據(jù)庫分區(qū)優(yōu)化數(shù)據(jù)庫性能
數(shù)據(jù)庫分區(qū)指的是將表和索引劃分為不同的區(qū)域,在搜索的過程中,通過明確數(shù)據(jù)所在的區(qū)域來提升數(shù)據(jù)庫性能的一種方法。數(shù)據(jù)庫分區(qū)能夠?qū)⒋蟊砗退饕齽澐譃楦奖愎芾淼亩鄠€小區(qū)域,在數(shù)據(jù)處理的過程中,相對于整個大表和索引,小的區(qū)域能夠更快捷地完成數(shù)據(jù)處理、數(shù)據(jù)分析工作,提升了數(shù)據(jù)庫的性能。在將數(shù)據(jù)庫劃分成小的區(qū)域后,數(shù)據(jù)庫所需的管理時間大幅度降低,同時數(shù)據(jù)庫的處理能力也會有效提升,存在故障的數(shù)據(jù)區(qū)域會自動被屏蔽,使得數(shù)據(jù)庫的性能有效提升。數(shù)據(jù)庫分區(qū)能夠增強(qiáng)數(shù)據(jù)庫的可用性,如果數(shù)據(jù)庫中的某一個表的分區(qū)出現(xiàn)了某種故障,在這種情況下該表的其他區(qū)域數(shù)據(jù)可以繼續(xù)使用,避免了某一種故障影響大量的數(shù)據(jù),提升了數(shù)據(jù)庫的應(yīng)用便捷性。同樣這也使得數(shù)據(jù)庫的維護(hù)更為方便,如果某一表中出現(xiàn)了故障,則這一故障只會使得這一分區(qū)的數(shù)據(jù)不可繼續(xù)使用,在維修時,只需對這一分區(qū)的數(shù)據(jù)進(jìn)行維修,降低了維修難度。數(shù)據(jù)庫分區(qū)可以通過分級儲存來提升數(shù)據(jù)庫的性能,不同數(shù)據(jù)的使用頻率不同,高頻率的使用數(shù)據(jù)放在I/O的高端存儲或閃存上,使得在需要時能夠快速獲取相關(guān)數(shù)據(jù),低頻率的使用數(shù)據(jù)放在I/O的低端存儲上,以此來高效地利用系統(tǒng)的I/O性能,提升數(shù)據(jù)庫的響應(yīng)速度。此外,數(shù)據(jù)庫分區(qū)最顯著的優(yōu)點(diǎn)就是在對分區(qū)對象進(jìn)行查詢時,只需搜索對應(yīng)的分區(qū)即可快速得到相關(guān)的數(shù)據(jù),有效提升了數(shù)據(jù)的檢索速度。常見的數(shù)據(jù)庫分區(qū)方式有列表分區(qū)和范圍分區(qū)兩種方式。
以對數(shù)據(jù)庫分區(qū)方式進(jìn)行研究來提升數(shù)據(jù)庫的性能為例,可以選擇Windows server2003 x64的操作系統(tǒng),選擇8GB內(nèi)存、CPU為AMD? P8384 2.7GHz×2、Oracle 10.2.0.1的配置,在100M共享寬帶的環(huán)境下進(jìn)行測試,測試的數(shù)據(jù)庫為默認(rèn)配置,在測試之前沒有對數(shù)字庫進(jìn)行優(yōu)化,同樣在每一次測試之前都會將數(shù)據(jù)庫清空緩存并重啟,因此,測試結(jié)果不存在數(shù)據(jù)緩存所造成的影響,保證了數(shù)據(jù)的科學(xué)性。在測試中發(fā)現(xiàn)對于相同的數(shù)據(jù)量、相同分區(qū)個數(shù)、每一個分區(qū)的數(shù)據(jù)量大致相同的情況下,未分區(qū)性能<范圍分區(qū)性能<列表分區(qū)性能,由此可見,數(shù)據(jù)庫分區(qū)尤其是列表分區(qū),能夠大幅提升數(shù)據(jù)庫的處理速度;數(shù)據(jù)量越高,列表分區(qū)的優(yōu)勢越明顯。在測試過程中通過SQL分頁來對記錄進(jìn)行查詢,讀取到了15條記錄。分區(qū)字段上配備有全局索引,而其他字段上無相應(yīng)的索引。由測試可以得出結(jié)論,數(shù)據(jù)庫分區(qū)能夠有效提升數(shù)據(jù)庫的性能,而列表分區(qū)比范圍分區(qū)的效果更好,且待處理的數(shù)據(jù)量越多,則列表分區(qū)的效果越明顯。
5 總結(jié)
本文根據(jù)數(shù)據(jù)庫的常見運(yùn)行問題分析了影響數(shù)據(jù)庫運(yùn)行速率的主要原因,并根據(jù)這些原因給出了相關(guān)的解決措施,認(rèn)為可以通過SQL優(yōu)化、索引優(yōu)化和數(shù)據(jù)庫分析來提升數(shù)據(jù)庫的性能,本文所提出的數(shù)據(jù)庫優(yōu)化方法適用于大多數(shù)的數(shù)據(jù)庫,因此希望能夠通過本文的相關(guān)內(nèi)容推進(jìn)我國數(shù)據(jù)處理技術(shù)的發(fā)展。
參考文獻(xiàn):
[1] 諶林,鄭泓楠.分布式數(shù)據(jù)庫查詢處理和優(yōu)化算法[J].中外企業(yè)家,2015(15):145.
[2] 黃卓洲.淺談SQL數(shù)據(jù)庫優(yōu)化技術(shù)在信息管理系統(tǒng)中的應(yīng)用[J].中國新通信,2020(2):104.
[3] 吳尚,張靖,徐道磊.Oracle數(shù)據(jù)庫性能的優(yōu)化設(shè)計思路研究[J].數(shù)字技術(shù)與應(yīng)用,2019(12):167,169.
[4] 田程程,周宏偉,王滕.Oracle數(shù)據(jù)庫系統(tǒng)的性能優(yōu)化研究[J].電子制作,2019(24):45-46,56.
【通聯(lián)編輯:李雅琪】