摘 要:在電信網管系統中,為了對電信設備進行管理和性能優化,數據查詢操作是必不可少的。因為劣質SQL語句和優質SQL語句之間的操作速度差別可達上百倍,因此采用了SQL語句優化技術來提高查詢的效率,又因電信網管系統常需進行海量數據查詢,所以利用恰當的分頁顯示技術,進一步提高系統的響應速度。實踐證明了該方案的可性行。
關鍵詞:電信網管系統;查詢;SQL;分頁顯示
中圖分類號:TP311 文獻標識碼:A
文章編號:1004373X(2008)0113703
Study of Inquiry on Telecommunication Network Management System
JU Chunfei
(Xijing University,Xi′an,710123,China)
Abstract:In telecommunication network management system,in order to carry on the management and the optimizing performance to the telecommunication equipment,the data inquiry operation is essential.Because the difference between SQL sentence operating speed may reach hundred times,therefore using the SQL sentence optimization techniques to enhance the efficiency of inquiry.And further because the telecommunication network management system often carry on the magnanimous data inquiry,so using Pagination-display further enhances the system the speed of response.The practice indicated that,this plan is feasibility.
Keywords:telecommunication network management system;inquiry;SQL;pagination-display
在設計電信網管系統時,為了提高設備的可維護性、可管理性及優化設備的性能,相關數據的查詢和統計是必不可少的,可以說查詢的效率直接影響到系統的響應速度。要想提高系統的響應速度,可通過SQL語句的優化來實現,對于海量數據,劣質SQL語句和優質SQL語句之間的操作速度差別可以達到上百倍。此外,對大數據量的查詢結果,還可以采用分頁顯示技術來進一步減少系統的響應時間。
本文根據電信系統中數據查詢的特點,結合相關查詢技術研究的新進展,討論了如何在電信系統設計中應用SQL語句優化和分頁顯示等查詢技術提高系統的效率。對電信網管系統中統計和查詢模塊的設計具有一定的指導作用。
1 SQL語句優化技術
1.1 SQL語句優化的原因
電信系統數據庫的優化通常可通過對網絡、硬件、操作系統、數據庫參數和應用程序的優化來進行。根據統計對網絡、硬件、操作系統、數據庫參數進行優化所獲得的性能提升全部加起來只占數據庫應用系統性能提升的40%左右,其余60%的系統性能提升全部來自對應用程序的優化。因此可以肯定,通過優化應用程序來對數據庫系統進行優化能獲得更大的收益[1]。
對應用程序的優化通常可分為兩個方面:源代碼的優化和SQL語句的優化。由于涉及到對程序邏輯的改變,源代碼的優化在時間成本和風險上代價很高。另一方面,源代碼的優化對數據庫系統性能的提升有限,因為應用程序對數據庫的操作最終要表現為SQL語句對數據庫的操作。
對SQL語句進行優化有以下一些直接原因:
(1) SQL語句是對數據庫(數據)進行操作的惟一途徑,應用程序的執行最終要歸結為SQL語句的執行,SQL語句的效率對數據庫系統的性能起到了決定性的作用。
(2) SQL語句消耗了70%~90%的數據庫資源。
(3) SQL語句獨立于程序設計邏輯,對SQL語句進行優化不會影響程序邏輯,相對于對程序源代碼的優化,對SQL語句的優化在時間成本和風險上的代價都很低。
(1) SQL語句可以有不同的寫法,不同的寫法在性能上的差異可能很大。
(2) SQL語句易學難精通,SQL語句的性能往往同實際運行系統的數據庫結構及記錄數量等有關,不存在普遍適用的規律來提升性能。
1.2 SQL語句優化的難點及解決方案
人們在使用SQL時往往會陷入一個誤區,即太關注所得到的結果是否正確,而忽略了不同的實現方法之間可能存在的性能差異,這種性能差異在大型的或是復雜的數據庫環境中表現得尤為明顯。存在的問題有:不良的SQL往往來自于不恰當的索引設計、不充分的連接條件和不可優化的WHERE子句。在對他們進行適當的優化后,其運行速度有了明顯地提高。下面將從這3個方面分別進行總結[4]:
1.2.1 不合理的索引設計的解決方案
(1) 有大量重復值、且經常有范圍查詢(between,>,< ,>=,< =)和order by,group by發生的列,可考慮建立群集索引;
(2) 同時存取多列,且每列都含有重復值可考慮建立組合索引,組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。
1.2.2 不充分的連接條件的解決方案
表操作在被實際執行前,查詢優化器會根據連接條件,列出幾組可能的連接方案并從中找出系統開銷最小的最佳方案。因此要充分考慮帶有索引的表、行數多的表;內外表的選擇可由公式:外層表中的匹配行數*內層表中每一次查找的次數確定,乘積最小為最佳方案。
1.2.3 不可優化的WHERE子句的解決方案
優化即WHERE子句利用了索引,不可優化即發生了表掃描或額外開銷。
(1) 對列的操作都將導致表掃描,他包括數據庫函數、計算表達式等,查詢時要盡可能將操作移至等號右邊。
(2) in,or子句常會使用工作表,使索引失效。如果不產生大量重復值,可以考慮把子句拆開,拆開的子句中應該包含索引。
綜上所述SQL語句優化的實質就是在結果正確的前提下,用優化器可以識別的語句,充分利用索引,減少表掃描的I/O次數,盡量避免表搜索的發生。根據電信系統查詢的特點,可把索引建立在日期上,因為他可以縮小查詢的范圍,而且是電信查詢中最頻繁使用和最需要排序的字段。
1.3 SQL語句優化的實現
1.3.1 建立“適當”的索引
經分析電信網管系統的庫表結構,發現設備告警和日志的庫表中都有入庫時間,設備性能庫表中都有起始時間和中止時間,而且重復較少。又因為我們的WHERE子句使用了多個列作為SELECT的條件,所以可以在庫表的多個列上建立復合索引。由于設備告警和日志都需要以設備名為統計限制條件,而性能是以設備號為限制條件的,所以我們可以在入庫時間、起始時間、中止時間、設備名和設備號上建立組合索引,進一步提高效率。
以日志為例建立索引:
建立好索引后,就要設計WHERE子句盡量使關鍵查詢形成索引覆蓋,只有這樣才可以很好地利用建立的索引,以提高統計和查詢的效率。
1.3.2 優化WHERE子句
經過分析和研究,我們發現WHERE子句按照以下規則編寫可以提高效率。
(1) 選擇一個好的表連接順序。當在WHERE子句中有多個表連接時,WHERE子句中排在最后的表應當是返回行數可能最少的表,有過濾條件的子句應放在WHERE子句中的最后。
(2) 最好不要在WHERE子句中使用函數或表達式,如果要使用的話,最好統一使用相同的表達式或函數,這樣便于以后使用合理的索引。
(3) 同一個SQL子句應該盡可能簡單,將復雜的SQL 子句改寫為簡單的SQL子句。
(4) 使用WHERE (NOT)EXISTS來代替(NOT)IN子句,使用NOTEXISTS 子句可以有效地利用索引。
(5) 通過使用>=、<=等,避免使用NOT命令。
(6) 在查詢時盡量少用格式轉換。
(7) ORDERBY語句。ORDERBY語句決定了數據庫如何將返回的查詢結果排序。任何在ORDER BY語句的非索引項或者有計算表達式都將降低查詢速度。仔細檢查ORDERBY語句以找出非索引項或者表達式,他們會降低性能。解決這個問題的辦法就是重寫ORDERBY語句以使用索引,也可以為使用的列建立另外一個索引,同時應絕對避免在ORDERBY子句中使用表達式。
(8) ISNULL與ISNOTNULL。不能用NULL作索引,任何包含NULL值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有NULL,該列就會從索引中排除。也就是說如果某列存在空值,即使對該列建索引也不會提高性能。任何在WHERE子句中使用ISNULL或ISNOTNULL的語句優化器是不允許使用索引的。
根據以上總結,我們進行統計的SQL語句可以組合為以下形式:
(1) 日志查詢
select count(*) from日志庫表 where username = 用戶名 and devtype=設備類型 and devname=設備名 and cmdtime>=某時間 and cmdtime<某時間
(2) 告警查詢
select count(*) from告警庫表 where devtype=設備類型and devname=設備名and alarmtype =告警類型and cmdtime>=某時間 and cmdtime<某時間
在以上的SQL語句中使用>=、<=等,避免使用NOT命令,以提高查詢的效率,又因為cmdtime(入庫時間)、startime(起始時間)和 endtime(結束時間)的過濾條件比較確定,能大大縮小查詢范圍,所以我們將最具有選擇性的cmdtime,startime和 endtime放在WHERE子句中的最后。接下來在進行日志和告警統計時,把devname的過濾條件放在時間過濾條件的前面,形成了索引覆蓋,進一步提高了效率。
2 數據分頁顯示技術
2.1 數據分頁顯示技術的比較
由于電信系統數據庫的數據量較大,在進行網管數據查詢的時候,需要遍歷數據庫中的每一條記錄。經試驗當查詢的結果超過8萬條記錄時,查詢結果的顯示就會出現問題,因此需要采用分頁顯示技術,使查詢結果更快、更好地顯示給用戶 [2]。
目前比較廣泛使用的分頁顯示方式是將查詢結果緩存在內存中,翻頁的時候從緩存中取出一頁數據顯示。這種方法有兩個主要的缺點:一是用戶可能看到的是過期的數據;二是如果數據量非常大時第一次查詢遍歷結果集會耗費很長時間,并且緩存的數據會占用大量內存,效率明顯下降。
經典的數據分頁方法是:ADO記錄分頁法,也就是利用ADO自帶的分頁功能(利用游標)來實現分頁。但是這種分頁方法僅適用較小數據量的情形,因為游標本身有缺點:游標是存放在內存中,很費內存;游標一旦建立,就將相關的記錄鎖住,直到取消游標;對于多表和大表中定義的游標(大的數據集合),循環很容易使程序進入一個漫長的等待甚至死機。尤其對于非常大的數據模型而言,分頁檢索時,如果按照傳統的每次都加載整個數據的方法是非常浪費資源的。
較好的分頁顯示做法應該是每次翻頁的時從數據庫里檢索頁面大小塊區的數據,從而加快數據的顯示,也不會耗費大量的資源。
2.2 數據分頁顯示的實現
根據電信網管的特點,利用SQL語言的游標,確定需要返回的當前頁的搜索結果,并將其保存在內存中,后續的記錄再通過連數據庫取得,下面是分頁的實現。
在數據庫中創建一個存儲函數,這個存儲函數的輸入參數是:當前的頁數、每一頁的記錄數和從數據庫得到的要輸出的總記錄數。根據以上輸入參數,得到要顯示頁的內容。具體的存儲過程如下:
名稱:sta[CD#*2]pageView
參數設置:
實現過程:
(1) 根據用戶輸入的查詢條件,統計出符合條件的總的記錄數,記錄在@recordcount 中,假設用戶要訪問id號為 @pageid頁的內容。
Select @recordcount = count ( * )from sta[CD#*2]pageView where pageid = @pageid
(2) 為上述的查詢結果定義游標。一方面可以節省資源,另一方面可以避免掃描整個記錄集,提高定位速度。
(3) 利用游標和我們設定的參數,確定當前頁的第一條記錄和最后一條記錄的絕對位置,并把他們存在 @pagebegin 和 @pageend 中。
(4) 返回 @pagebegin 和 @pageend之間的記錄,即我們要訪問的那頁記錄。
最后在查詢模塊中調用以上存儲過程,將記錄集保存在一個二維數組中。遍歷這個二維數組,就可以獲得所有本頁的內容,并以適當的形式顯示出來。
2.3 數據分頁顯示性能分析
(1) 每次只傳回一頁記錄,而且只形成一個記錄集,而不必像傳統的游標法用:s.next來輸出Recordset記錄,讀取速度得到提高。
(2) 數據庫沒有用到臨時表,比轉儲記錄集的速度大大提高。
(3) 采用一個滾動游標,而且游標只經過2個操作就完成定位,速度也會大大提高。
選擇不同的數據,測試采用分頁顯示方法前后的效率和差異。測試數據和測試結果見表1。
從測試結果可以看出,采用了這種分頁顯示方法后,查詢速度隨著查詢量的增大而明顯提高。
3 結 語
隨著電信網管技術的不斷發展,人們對網絡性能數據的統計和分析的重視程度越來越高,因而對數據查詢的效率和精度的要求也在不斷提高,從而在對網管中設備的定性分析基礎上,為網絡管理提供維護和建設的依據。而查詢的效率和精度的提高與多種技術有關,并且很多技術也在不斷更新,所以要及時了解相關研究的新進展,及時采用新技術,充分發揮查詢在電信網管中的作用。
參 考 文 獻
[1]閔翔.人工智能數據庫系統優化的捷徑[J].中國計算機報,2001,16(5):14-16.
[2]勾成圖,張璟,李軍懷.海量數據分頁機制在Web信息系統中的應用研究[J].計算機應用,2005,8(8):11-13.
[3]王雄英,韓衛占.通信網管理技術[M].北京:國防工業出版社,2003.
[4]Poetier P J.數據庫技術大全[M].北京:電子工業出版社,1999.
[5]劉宇雷,錢淘.WWW對大量數據查詢的一種實現[J].微計算機應用,2001,22(6):344-346.
[6]羅駿,何羽.SQL實用簡明教程[M].北京:清華大學出版社,2004.
[7]蔡葵.SQL語句的查詢優化分析[J].華南金融電腦,2004(8):45-46.
[8]盤莉莉.SQL語句優化原則[J].福建電腦,2004(8):12-42.
[9]馬寧.如何提高SQL語句的查詢效率[J].江西電力職業技術學院學報,2005,18(2):37-38.
[10]Thomas Connolly,Carolyn Begg.Database Systems A Practical Approach to Design,Implementation and Management[M].Third Edition.北京:機械工業出版社,2005.
[11]Paulley G,Larson P.Exploiting Uniqueness in Query Optimization[C].In:IEEEInt.Conf.on Data Engineering,1994.
作者簡介 巨春飛 女,1974年出生,陜西省興平縣人,助教,碩士。主要從事軟件工程方向的研究。
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。”