施元超
同濟大學軟件學院,上海 201804
金融管理軟件中大型數(shù)據(jù)庫性能優(yōu)化策略研究
施元超
同濟大學軟件學院,上海 201804
為了提高金融領域中大型數(shù)據(jù)庫應用系統(tǒng)的性能和效率,縮短大批量數(shù)據(jù)的處理時間,本文深入研究了提高數(shù)據(jù)庫系統(tǒng)性能的策略。首先,分析了數(shù)據(jù)庫分區(qū)操作技巧;其次介紹了影響SQL語句性能的因素;然后結合實例說明了利用索引的SQL優(yōu)化技巧;最后總結了SQL性能優(yōu)化的意義。
大批量數(shù)據(jù);分區(qū);索引;SQL優(yōu)化
根據(jù)研究顯示,金融領域軟件系統(tǒng)的數(shù)據(jù)庫都存儲著數(shù)以億計的記錄,因此,數(shù)據(jù)庫應用系統(tǒng)性能問題尤為突出。當用戶每次操作的數(shù)據(jù)量在幾十萬記錄時,全表掃描一次往往需要數(shù)10min,但可能只需返回幾條記錄。此時,怎樣減少數(shù)據(jù)吞吐,對數(shù)據(jù)庫性能優(yōu)化就成為關鍵。
在大量數(shù)據(jù)處理的項目中,可使用分區(qū)表來提高系統(tǒng)的性能并方便數(shù)據(jù)管理。金融領域的數(shù)據(jù)庫應用中,要處理的數(shù)據(jù)量通??蛇_到GB級。為了使數(shù)據(jù)在讀寫操作和查詢更快,數(shù)據(jù)庫提供了對表和索引的分區(qū)技術。
分區(qū)的優(yōu)點:增強可用性、維護方便、均衡I/O、改善查詢性能。因oracle在金融領域的廣泛應用,本文以oracle舉例。
Oracle提供的分區(qū)方法有:范圍分區(qū)、散列分區(qū)和復合分區(qū)。
金融管理軟件中業(yè)務數(shù)據(jù)多以日期或交易序號組織,所以可采用范圍分區(qū)。通常根據(jù)交易序號或業(yè)務日期范圍分區(qū),有時也采用復合分區(qū),例如先根據(jù)日期再根據(jù)交易編號分區(qū)。
注意,在進行分區(qū)表操作時,最好指定分區(qū),因為指定了分區(qū),系統(tǒng)執(zhí)行時只操作該分區(qū)的記錄,提高了處理的速度。
SQL操作大約消耗70%~90%的資源,它獨立于程序設計邏輯,改進SQL是最好、最安全的提高性能的途徑,SQL的優(yōu)化時間和風險成本都很低。
影響SQL性能的因素很多,有幾個主要原因:書寫不規(guī)范,它會導致SQL語句不必要的重復解析;未充分利用數(shù)據(jù)庫的功能,如查詢的并行化處理;過多的I/O操作,如未不恰當使用索引導致全表掃描;高頻處理垃圾記錄,如多表連接時過濾條件位置不當導致中間結果集包含太多的垃圾記錄。
過多的I/O操作會占用CPU、消耗大量內存,而優(yōu)化I/O最好的辦法是用索引掃描代替全表掃描。
1)建立索引的原則:(1)在主鍵、頻繁被訪問的列和經常被連接(非外鍵)列上建聚簇索引,當所有值唯一時,定義唯一索引;(2)有大量重復值,經常有范圍查詢、排序、分組的列建立聚簇索引;經常同時存取多列,且每列都有重復值建復合索引來覆蓋查詢,把引用最頻繁的列作為前導列;并盡量使關鍵查詢形成覆蓋查詢;(3)條件表達式中經常用到的不同值多的列建索引。
2)避免不合理使用索引
通過建立索引,一般都會加快查詢速度;但當oracle優(yōu)化器在執(zhí)行時不當使用索引時,會得到反效果。例如:
假設:當每個表有幾萬條記錄,兩表都未建索引,2s就可查出結果。而當在A表中建立復合索引(復合索引里包含 tradedate字段)數(shù)據(jù)庫會用索引,這時查詢要幾分鐘。所以索引使用不當會嚴重影響語句性能。下面給出幾個優(yōu)化方法:
1)直接去掉索引,這不是好方法,別的查詢可能需要這個索引。
2)改寫where語句: WHERE TRIM(A.TRADEDATE) =b.TRADEDATE兩三秒即出結果。因為oracle默認有函數(shù)的字段不用索引,查詢語句忽略索引,仍全表掃描。
3)在B表里建index(tradedate,account),改為執(zhí)行時間為半秒。因為Oracle默認使用前表索引,例中只會使用B表的有效索引。
3)應用基于函數(shù)的索引
基于函數(shù)的索引(FBI)提供了索引計算列,并在查詢中使用這些索引的能力。FBI的實質是對查詢所需中間結果進行預處理。如果一個FBI與查詢語句中的內嵌函數(shù)完全匹配,CBO在生成查詢計劃時,將自動啟用索引范圍掃描替換全表掃描。函數(shù)越復雜,基于該函數(shù)創(chuàng)建FBI對SQL查詢優(yōu)化作用越明顯。
4)強制使用索引,利用oracle的并行功能
Oracle對全索引掃描有如下限制:SQL請求的全部列必須駐留在索引樹中;即SELECT和WHERE子句中的所有數(shù)據(jù)列必須存在于索引中。Oracle提供了SQL提示強制全索引掃描。可指定index_ffs提示強制快速索引掃描,這常與parallel_index提示組合。下面查詢強迫使用并行快速全索引掃描提高效率,
查詢優(yōu)化是取得良好執(zhí)行性能并簡化管理的關鍵因素,而對于交易數(shù)據(jù)成百萬計的金融軟件尤為重要。優(yōu)化SQL,關鍵是索引,怎樣合理利用索引是一個復雜深刻的問題。本文其進行簡單總結,希望對開發(fā)人員幫助查詢優(yōu)化器獲得更好的執(zhí)行計劃有所幫助,這些執(zhí)行計劃是查詢優(yōu)化器無法靠自身獨立工作產生的。
[1]王振輝,等.基于關系數(shù)據(jù)庫的SQL查詢語句執(zhí)行過程效率分析與對策.計算機時代,2008.
[2]豢葵.SOL語句的查詢優(yōu)化分析.華南金融電腦2004.
[3]Beth Van Hom,Mark KorrS.優(yōu)化SOL查詢語句的經驗.Oracle應用開度論文集,1992.
[4]徐立溥.淺談ORACLE數(shù)據(jù)庫的優(yōu)化及提升.硅谷,2009.
[5]韓中華,等.動態(tài)SQL在企業(yè)綜合管理系統(tǒng)中的實現(xiàn).自動化與儀表,2008.
TP31
A
1674-6708(2010)24-0206-02