摘要:數據庫作為高校收費管理系統的核心和基礎,其性能的優劣對整個系統的高效運行起著重要的作用。本文以高校收費管理系統中的SQL Server數據庫為研究對象,在對數據庫優化的一般策略進行研究的基礎上,提出了適合高校收費管理系統的數據庫優化方法。
關鍵詞:SQL Server 數據庫 優化
隨著高校信息化管理程度的不斷深入,收費管理已經從原來的手工開票、現金收取、人工記賬階段,轉變為現在的銀行代扣、軟件管理階段。目前,多數高校都采用了學生收費管理軟件,基本上實現了信息化管理[1]。然而,隨著高校辦學規模的越來越大,很多的人開始采用數據庫來處理信息。由此一來用戶一多,吞吐量加大就為網絡通訊帶來了很大的壓力。數據庫的儲存空間必須隨之增長,由此使得數據庫的性能問題受到了廣泛的重視[2]。
1 SQL語句優化
SQL語句優化要達到的效果就是使用性能比較之下很好的SQL語句轉換為性能沒有那么好的相應的SQL語句。想要操作好數據庫的話就要使用好SQL語句,所以說能否高效的使用好SQL語句完全影響到了數據庫系統的性能的穩定性。早在各大高校收費管理系統研制開發出來的時候,SQL語句在通常情況下就沒能否展現出SQL語句的性能的好壞,主要的原因就是那個時候數據庫數據量過于少。只是在通過實踐中應用過后,數據庫中數據越來越豐富,當下系統是否能采取措施解決系統的響應速度相關的問題變得越來越重要。
下面就高校收費管理系統中SQL語句優化的方法進行探討:
1.1 避免檢索表中所有的列 在收費管理系統開發初期,由于不同用戶檢索目的不明確,SQL語句中往往使用select*from<表名或視圖名>,因為該語句執行一次命令的時候都必須一一的掃描好表中所有列字段,所以就耗費了比較長的時間。該語句不必對所有的列進行檢索的時候主要是在系統投入實際操作過后了,因為那個時候能夠比較有目的的針對用戶進行檢索。例如對于教材管理人員來說,需要查詢的結果是的每個學生的教材費繳費總額,可以將以上SQL語句改為select學號,姓名,教材費from StudentPay。
1.2 應盡可能不在where子句中使用“or”操作符 使用“or”操作符會導致全表掃描而導致效率差,例如要查詢“軟件工程”和“計算機科學與技術”兩個專業的學費繳納情況:
原語句:select學費from StudentPay where 專業=“軟件工程”or專業=“計算機科學與技術”
應將上面的查詢語句改為:
select 學費from StudentPay where專業=“軟件工程”
union all
select學號from StudentPay where 專業=“計算機科學與技術”
1.3 盡可能的不在WHERE條件里使用非聚合表達式 由于非聚合表達式想要運用索引的話難度比較大,所以一般情況下SQL Server必須做大范圍的掃描工作。如!=、IS NULL或IS NOT NULL、IN、NOT lN等操作符構成的表達式都是非聚合表達式。使用非聚合表達式造成的后果就是查詢效率急速下降。舉例來說:
Select*from StudentPay where繳費額!= 4800,將無法通過索引來確定將要命中的行數,因此需要搜索該表的所有行。
1.4 避免正規表達式 matches、like關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時間。例如:select?from 學費信息表where繳費額like’45’即使在smt id字段上建立了索引,在這種情況下也還是采用順序掃描的方式。如果把語句改為select*from StudentPay where 繳費額>=4500 and 繳費額<4600,執行查詢的時候如果能采取索引來查詢的話,其查詢速度是相當快的。
2 索引優化
2.1 索引簡介 索引是一個單獨的、物理的數據結構,這個數據結構中包含表中的一列或若干列的值以及與此相關的指向表中物理標識。像這樣的值的數據都也的邏輯指針的集合[3]。它之所是是一種邏輯性的集合,主要原因就是當指針在按照規定的順序進行排列之前就能夠邏輯的指向存儲在表的指定列中的數據值。數據庫使用索引的方法和使用書籍中的索引的方法在有很多的相同點,因為他們找特定值的方法就是采取搜索索引這樣的方式,接下來才依據指針所指搜索到包含該值的行。
2.2 索引的優化作用 索引是從數據庫中獲取數據的最高效方式之一,絕大多數的數據庫性能問題都采用索引技術得到解決。創建索引不但能維護被索引列的唯一性,而且提供快速訪問表中數據的策略。通過設計良好的索引,可以顯著提高數據庫查詢和應用程序的性能。索引可以減少為返回查詢結果集而必須讀取的數據量,還可以強制表中的行具有唯一性,從而確保數據的完整性。
2.3 索引的使用原則 合理的使用索引可以加快數據檢索速度,從而大大提高查詢效率,然而索引的使用將占用磁盤空間,并且降低添加、刪除和更新行的速度,因此索引的使用應考慮以下原則:①在經常進行搜索的列上建立索引。例如學號、姓名等經常搜索的列應建立索引。②對于查詢中很少涉及的列或者重復值比較多的列,建立索引并不能提高查詢效率。例如學生所在院系、專業等字段,不適宜建立索引。③在頻繁進行排序或分組的列上,以及經常需要根據范圍進行搜索的列上建立索引。④如表中有主鍵或者外鍵,一定要為其建立索引。因為主鍵可以加速定位到表中的某一行,結合索引的使用,可以是查詢的速度加倍。⑤避免在組合列上使用索引,組合列上的索引不夠靈活。⑥對一些特殊字段的數據類型,不要建立索引。
2.4 索引在高校收費管理系統中的應用 高校收費管理系統運行到一定階段,往往包含存儲著大量數據的表,這時人們在進行查詢時,如果使用全表掃描,會花費非常多的時間,同時會導致查詢超時這樣的錯誤。通過合理地創建索引,可以避免全表掃描,從而獲得性能的提升。
例如在在高校收費管理系統中查詢某位學生信息的數據庫中,一般是通過學生的學號和姓名來查詢學生的詳細信息,如果學號或者姓名沒有建立索引,那么每次查詢所執行的就是全表掃描。全表查詢作業不適合數據表規模、批量數據量都比較大的數據表,因為在SQL數據庫數據處理過程總我們所消耗的信息資源過大。
例如在高校收費管理系統中創建數據庫時,可以通過以下語句在StudentPay中的學號列建立聚集索引
CREATE CLUSTERED INDEX 學號索引:
ON StudentPay(學號)
按照學生的學號建立索引,在查詢請求的時候,SQL SERVER將查詢索引中的學號,然后根據索引直接提取對應的行,以快速的查詢學生繳費信息。
3 使用存儲過程
存儲過程(Stored Procedure)是一組編譯在單個執行計劃中的SQL語句。它可以將一些固定的操作集中起來由數據庫服務器來完成。SQL Server中的存儲過程與其他編程語言中的過程類似,存儲過程具備包含用于在數據庫中執行操作(包含調用其他過程)的編程語句,并且能都接受輸入參數,并以輸出參數的格式向調用過程或批處理返回多個值。
在SQL Server中使用存儲過程的優勢主要體現在以下幾個方面:
①加快系統運行速度。存儲過程只在創建時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語言執行一次就編譯一次,所以使用存儲過程可以提高數據庫執行速度。
②實現代碼重用。可以實現模塊化程序設計,存儲過程一旦創建,以后可以在程序中調用任意多次。可以改進引用程序的可維護性,并且允許應用程序統一訪問數據庫。
③減少網絡流量。存儲過程在服務上存儲,應用程序不必傳輸存儲過程中的所有SQL語句,只須傳輸包含過程名和參數值的EXECUTE或CALL語句,大大減少網絡流量。
④封裝復雜操作。當對數據庫進行復雜操作時,例如對多個表進行插入記錄、刪除記錄、更新操作時,可用存儲過程將復雜操作封裝起來與數據庫的事務處理結合在一起使用。
⑤增強安全性。存儲過程可以為用戶指定相應的執行權限,這樣可以增加應用程序的安全性,保護應用程序不受SQL注入式攻擊。
在高校收費管理系統中,對于學生用戶經常要用到查詢自己繳費信息的情況,合理使用存儲過程,一方面可以在用戶查詢次數較多的情況下提高數據庫查詢的速度,另一方面也能夠有效保證數據的安全性。
例如針對學生進行繳費情況查詢,編寫一下存儲過程:
CREATE PROCEDURE up_ StudentPay
@type char(10)
AS
SELECT 學號,姓名,學費FROM StudentPay
WHERE 學號=@type
GO
當查詢學號為“20120109002”的學生學費信息時,只需以下SQL語句執行存儲過程:
up_ StudentPay '20120109002'
4 結語
數據庫系統的性能優化是一個比較大的研究范疇,包括硬件優化、服務器優化、操作系統優化等多個方面,本文主要基于高校收費管理系統,從應用方面研究了數據庫優化策略分析的基礎上提出部分見解,貫穿于數據庫應用系統整個生命周期。
參考文獻:
[1]孟凡斌,王偉.高校財務管理信息化背景下學費管理系統的擴展[J].中國管理信息化.2012(1).
[2]朱喜梅.基于SQL Server數據庫的性能調優策略與研究[D].哈爾濱理工大學碩士學位論文.2009.
[3]許瑞斌.數據庫優化策略分析[J].數字技術與應用.2012(3).
[4]劉志成,寧云智.數據庫系統原理與應用[M].機械工業出版社.2010(1).