楊薇,劉陽
(1.大連市91550部隊,遼寧大連 116023;2.大連東軟信息學(xué)院,遼寧大連 116023)
由于SQL Servers 數(shù)據(jù)庫管理系統(tǒng)具有較高的數(shù)據(jù)管理性能,因此被廣泛應(yīng)用于服務(wù)器和客戶體系結(jié)構(gòu)中。其系統(tǒng)的吞吐量、響應(yīng)時間以及并行處理能力,對于SQL 發(fā)生請求之后顯示返回結(jié)果的速度,以及在屏幕上含有數(shù)據(jù)時切換不同屏幕的速度等,這些方面都是SQL Server 數(shù)據(jù)庫性能的表現(xiàn)。我們在這里主要論述了SQL Server 數(shù)據(jù)庫的這些性能要注意的問題以及相關(guān)的優(yōu)化方法。
多個SQL語句組成了SQL Server數(shù)據(jù)庫的事務(wù)的邏輯單元,數(shù)據(jù)庫服務(wù)器執(zhí)行著事務(wù)的控制和處理,應(yīng)用程序則劃分了數(shù)據(jù)庫事務(wù)的起點和終點。在使用數(shù)據(jù)庫時,應(yīng)盡量縮短數(shù)據(jù)庫的事務(wù),事務(wù)短了,則其通過SQL 語句占用獲得的回滾空間和鎖就可以得到盡快釋放,從而降低SQL Server 數(shù)據(jù)庫系統(tǒng)在并發(fā)處理時的資源競爭。
查詢大量數(shù)據(jù)會大大增加數(shù)據(jù)服務(wù)器的負擔(dān),因此用戶在進行自定義條件查詢過的時候,如果表的數(shù)據(jù)量過大,則應(yīng)該要設(shè)定一個條件,以避免系統(tǒng)返回過多的信息量,導(dǎo)致DMNS的性能下降。系統(tǒng)返回大量數(shù)據(jù)會增加網(wǎng)絡(luò)通信量,從而造成網(wǎng)絡(luò)的擁擠,而如果客戶機的內(nèi)存不足,返回信息量嚴重超載,則會造成嚴重的錯誤。
當(dāng)應(yīng)用程序要對類似或者相同的數(shù)據(jù),例如代碼表這些數(shù)據(jù)進行反復(fù)操作的時候,可以從數(shù)據(jù)庫上一次性將數(shù)據(jù)檢索并下載到客戶機的緩存中,采取數(shù)據(jù)共享的技術(shù)對儲存好的數(shù)據(jù)進行反復(fù)使用。或者原數(shù)據(jù)窗口有事先儲存好的數(shù)據(jù),可以直接加以利用,而不用再去檢索服務(wù)器。通過減少對數(shù)據(jù)庫服務(wù)器的訪問,可以使其性能得到優(yōu)化。
優(yōu)化屏幕的速度,就是優(yōu)化其顯示和切換的速度,主要要注意以下幾點:(1)減少屏幕窗口的使用功能,如果一個屏幕上有過多功能,則會導(dǎo)致其運行速度減慢;(2)在需要檢索較大數(shù)量的數(shù)據(jù)時,利用數(shù)據(jù)窗口注意要有所限制,限制記錄從數(shù)據(jù)庫返回緩沖區(qū)的個數(shù),應(yīng)該在數(shù)據(jù)窗口即將填滿數(shù)據(jù)的時候讓用戶看到屏幕并得到其控制權(quán),而不是要等到數(shù)據(jù)全部都檢索出來,之后再進行數(shù)據(jù)窗口的填充;(3)避免讓用戶等待空屏,要在顯示數(shù)據(jù)窗口之后再通過服務(wù)器檢索數(shù)據(jù)。
ADO 有著便于使用和遠程數(shù)據(jù)訪問的特點,其速度較快,占用的內(nèi)存少,對磁盤造成的遺留痕跡小,而且其關(guān)鍵功能是支持服務(wù)器和客戶端的建立以及基于Web的應(yīng)用程序,通過遠程數(shù)據(jù)的訪問,可以將服務(wù)器的數(shù)據(jù)通過來回傳輸移動到Web 網(wǎng)頁或者客戶端的應(yīng)用程序中,用戶再通過客戶端來操作或者更新數(shù)據(jù),最后再把數(shù)據(jù)傳輸回服務(wù)器。
網(wǎng)絡(luò)是服務(wù)器和客戶端的工作基礎(chǔ),而由于網(wǎng)絡(luò)的寬帶存在限制,往往也會影響到SQL Server 數(shù)據(jù)庫系統(tǒng)性能的優(yōu)化。通過利用存儲過程來減少對SQL Server 數(shù)據(jù)庫的大量查詢,可以避免網(wǎng)絡(luò)流量過大而造成的網(wǎng)絡(luò)擁堵和堵塞,從而可以提高SQL Server 數(shù)據(jù)庫系統(tǒng)的吞吐量,加快其響應(yīng)時間。一方面,客戶只需傳遞一些參數(shù)來調(diào)用存儲過程,而不用向SQL Server 數(shù)據(jù)庫服務(wù)器發(fā)送大量語句。而另一方面,通過利用服務(wù)器的處理優(yōu)勢來處理數(shù)據(jù),改善了下載原始數(shù)據(jù)再進行處理的繁瑣情況,通過減小結(jié)果的集合而實現(xiàn)了網(wǎng)絡(luò)負載的優(yōu)化。
在進行大量數(shù)據(jù)的統(tǒng)計處理時,客戶機的運行速度會隨著數(shù)據(jù)庫數(shù)量的增加而減慢,當(dāng)處理表的記錄多達上幾十萬甚至幾百萬條的時候,運行速度減慢的效果會更加明顯。而如果在編制程序時,善于利用臨時列表的話,就可以大大的提高系統(tǒng)的運行速度和處理時間,從而減少甚至忽略因處理表記錄過多對系統(tǒng)運行處理性能的影響。所謂的臨時列表,是系統(tǒng)在運行時存放在臨時數(shù)據(jù)庫的文件,這些文件會在系統(tǒng)完成數(shù)據(jù)處理之后被自動刪除。
優(yōu)化SQL 語句,實質(zhì)上就是保證正確結(jié)果的前提下,通過對索引的充分利用,采用服務(wù)器可以識別的語句來進行索引,以減少對服務(wù)器的全表掃描并避免返回沒有限定條件的信息。
例如下面的兩條SQL 語句:
語句一:select 班級,姓名from T1 where 姓名not in(select 姓名fromT2);
語句二:select 班級,姓名from T1 where not exists(select 班級FROM T2 where T2.姓名=T1姓名);
在上述的語句一和語句二中,兩者的的結(jié)果是一樣的,但是由于語句一沒有使用在T2表上建立的姓名索引,因此SQL Serve 在執(zhí)行的時候就會掃描整個T2表。而語句二中的子查詢因為使用了聯(lián)合查詢,所以SQL Serve 在執(zhí)行的時候就只是掃描T2表的部分數(shù)據(jù)。通過利用姓名索引,使語句二比語句一的檢索效率要高許多,通過語句的優(yōu)化,也使SQL Serve 數(shù)據(jù)庫的系統(tǒng)性能得到了優(yōu)化。同時,還要避免在表達式中使用條件列。例如“where 成績=‘90’”以及“where 成績/100>0.8”這兩個條件列。在這里,SQL的條件語句都有著恰當(dāng)?shù)乃饕菆?zhí)行語句的速度卻非常的慢,這是因為條件列中“where”字句對列的所有操作結(jié)果,都是SQL Serve 在執(zhí)行語句時通過對每列的計算的來的,所以SQL 要對全表進行掃描。而將上面兩個條件列語句改成“where 成績like‘90’”和“where 成績>80”,則SQL Serve 執(zhí)行語句的速度則會明顯快很多。
再者,在SQL語句中,還要避免使用不相等或者NULL條件列,例如“where 成績is null”和“where 成績≠80”,因為這樣的話雖然在查詢列例有索引,但這個索引卻無法被使用。
還有的話,在使用like 條件列時,要盡量避免賦值變量或者是以“%”作為開始,因為這種情況下索引也無法被使用,如“where姓名like‘%Jam’”和“where 班級like var_班級”。
在SQL 語句中,要避免用到in、not in的語句,而采用exists、not exists 語句的效果要比使用in、not in 語句的效果好得多。
對于視圖的查詢,最好是可以將其分解,變成對數(shù)據(jù)表的直接數(shù)據(jù)查詢。而在進行數(shù)據(jù)查詢時,程序員首先要查詢的往往是主表,而由于主表需要掃描整個表數(shù)據(jù),因此應(yīng)該將主表的數(shù)據(jù)量控制為最小的,主表的查詢列范圍也要比從表的查詢列范圍小。主表和從表之間的聯(lián)合要結(jié)合數(shù)據(jù)量的大小以及索引條件來考慮。
SQL Server 數(shù)據(jù)庫系統(tǒng)系能的優(yōu)化是一個復(fù)雜的系統(tǒng)工程,其貫穿了數(shù)據(jù)庫系統(tǒng)的整個生命周期,從系統(tǒng)的開發(fā)、到系統(tǒng)的設(shè)計、到系統(tǒng)的維護,每個環(huán)節(jié)和每個步驟都要注意,一點小小的失誤都會影響SQL Server 數(shù)據(jù)庫系統(tǒng)的最終性能。因此要重視對SQL Server 數(shù)據(jù)庫系統(tǒng)的優(yōu)化意識,要根據(jù)用戶軟件和硬件的實際配置、對于系統(tǒng)的性能和作用的要求、以及應(yīng)用程序的設(shè)計等情況來采取合適的優(yōu)化策略。而對于系統(tǒng)的網(wǎng)絡(luò)瓶頸、性能要求以及事務(wù)特點和儲存結(jié)構(gòu)等都要有深刻的認識和理解,并以其作為系統(tǒng)性能優(yōu)化的基礎(chǔ)。在進行系統(tǒng)開發(fā)的時候,還要結(jié)合實際情況對系統(tǒng)進行性能權(quán)衡優(yōu)化,以提高系統(tǒng)的整體性能。
[1]丁燕云,魏娟.淺析SQL 數(shù)據(jù)庫的性能優(yōu)化問題[J].科技信息(學(xué)術(shù)研究),2007(34).
[2]孔令富,秦宇.基于SQL Serve7.0大型數(shù)據(jù)庫應(yīng)用系統(tǒng)系能優(yōu)化的研究[J].計算機工程與設(shè)計,2001(05).
[3]陶銳.SQL Serve 應(yīng)用程序的性能檢測與優(yōu)化[J].赤峰學(xué)院學(xué)報(自然科學(xué)版),2006(04).
[4]王勇.基于SQL 數(shù)據(jù)庫的性能優(yōu)化問題分析[J].電腦知識與技術(shù),2008(15).
[5]楊柳.SQL Serve 數(shù)據(jù)庫的性能分析與優(yōu)化策略[J].科技創(chuàng)新導(dǎo)報,2011(01).
[6]谷震離.SQL Server 數(shù)據(jù)庫應(yīng)用程序性能優(yōu)化方法[J].計算機工程與設(shè)計,2006(15).