基于SQL Server 的數(shù)據(jù)庫應(yīng)用系統(tǒng)性能的優(yōu)化
出處:電子愛好者博客 發(fā)布于:2013-07-31 15:05:03
摘要:SQL Server 數(shù)據(jù)庫在實(shí)際的運(yùn)用中,往往會出現(xiàn)數(shù)據(jù)量過大的情況,如果不采取有效措施,就會導(dǎo)致系統(tǒng)性能不穩(wěn)定,出現(xiàn)連接超時、長時間等待和阻塞等情況。因此,我們從數(shù)據(jù)庫的設(shè)計(jì)以及SQL 語句等方面入手,論述了SQL Server 數(shù)據(jù)庫應(yīng)用系統(tǒng)性能的優(yōu)化。
0 引言
由于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)化方法。
1 優(yōu)化SQL Server 數(shù)據(jù)庫的設(shè)計(jì)
1.1 優(yōu)化數(shù)據(jù)庫事務(wù)
多個SQL 語句組成了SQL Server 數(shù)據(jù)庫的事務(wù)的邏輯單元,數(shù)據(jù)庫服務(wù)器執(zhí)行著事務(wù)的控制和處理,應(yīng)用程序則劃分了數(shù)據(jù)庫事務(wù)的起點(diǎn)和終點(diǎn)。在使用數(shù)據(jù)庫時,應(yīng)盡量縮短數(shù)據(jù)庫的事務(wù),事務(wù)短了,則其通過SQL 語句占用獲得的回滾空間和鎖就可以得到盡快釋放,從而降低SQL Server 數(shù)據(jù)庫系統(tǒng)在并發(fā)處理時的資源競爭。
1.2 優(yōu)化返回信息量
查詢大量數(shù)據(jù)會大大增加數(shù)據(jù)服務(wù)器的負(fù)擔(dān),因此用戶在進(jìn)行自定義條件查詢過的時候,如果表的數(shù)據(jù)量過大,則應(yīng)該要設(shè)定一個條件,以避免系統(tǒng)返回過多的信息量,導(dǎo)致DMNS 的性能下降。系統(tǒng)返回大量數(shù)據(jù)會增加網(wǎng)絡(luò)通信量,從而造成網(wǎng)絡(luò)的擁擠,而如果客戶機(jī)的內(nèi)存不足,返回信息量嚴(yán)重超載,則會造成嚴(yán)重的錯誤。
1.3 優(yōu)化訪問次數(shù)
當(dāng)應(yīng)用程序要對類似或者相同的數(shù)據(jù),例如代碼表這些數(shù)據(jù)進(jìn)行反復(fù)操作的時候,可以從數(shù)據(jù)庫上性將數(shù)據(jù)檢索并到客戶機(jī)的緩存中,采取數(shù)據(jù)共享的技術(shù)對儲存好的數(shù)據(jù)進(jìn)行反復(fù)使用?;蛘咴瓟?shù)據(jù)窗口有事先儲存好的數(shù)據(jù),可以直接加以利用,而不用再去檢索服務(wù)器。通過減少對數(shù)據(jù)庫服務(wù)器的訪問,可以使其性能得到優(yōu)化。
1.4 優(yōu)化屏幕速度
優(yōu)化屏幕的速度,就是優(yōu)化其顯示和切換的速度,主要要注意以下幾點(diǎn):(1)減少屏幕窗口的使用功能,如果一個屏幕上有過多功能,則會導(dǎo)致其運(yùn)行速度減慢;(2)在需要檢索較大數(shù)量的數(shù)據(jù)時,利用數(shù)據(jù)窗口注意要有所限制,限制記錄從數(shù)據(jù)庫返回緩沖區(qū)的個數(shù),應(yīng)該在數(shù)據(jù)窗口即將填滿數(shù)據(jù)的時候讓用戶看到屏幕并得到其控制權(quán),而不是要等到數(shù)據(jù)全部都檢索出來,之后再進(jìn)行數(shù)據(jù)窗口的填充;(3)避免讓用戶等待空屏,要在顯示數(shù)據(jù)窗口之后再通過服務(wù)器檢索數(shù)據(jù)。
1.5 優(yōu)化數(shù)據(jù)鏈接庫
ADO 有著便于使用和遠(yuǎn)程數(shù)據(jù)訪問的特點(diǎn),其速度較快,占用的內(nèi)存少,對磁盤造成的遺留痕跡小,而且其關(guān)鍵功能是支持服務(wù)器和客戶端的建立以及基于Web 的應(yīng)用程序,通過遠(yuǎn)程數(shù)據(jù)的訪問,可以將服務(wù)器的數(shù)據(jù)通過來回傳輸移動到Web 網(wǎng)頁或者 客戶端的應(yīng)用程序中,用戶再通過客戶端來操作或者更新數(shù)據(jù),再把數(shù)據(jù)傳輸回服務(wù)器。
1.6 優(yōu)化網(wǎng)絡(luò)負(fù)載
網(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ò)擁堵和堵塞,從而可以提高SQLServer 數(shù)據(jù)庫系統(tǒng)的吞吐量,加快其響應(yīng)時間。一方面,客戶只需傳遞一些參數(shù)來調(diào)用存儲過程,而不用向SQL Server 數(shù)據(jù)庫服務(wù)器發(fā)送大量語句。而另一方面,通過利用服務(wù)器的處理優(yōu)勢來處理數(shù)據(jù),改善了原始數(shù)據(jù)再進(jìn)行處理的繁瑣情況,通過減小結(jié)果的集合而實(shí)現(xiàn)了網(wǎng)絡(luò)負(fù)載的優(yōu)化。
1.7 善用臨時列表
在進(jìn)行大量數(shù)據(jù)的統(tǒng)計(jì)處理時,客戶機(jī)的運(yùn)行速度會隨著數(shù)據(jù)庫數(shù)量的增加而減慢,當(dāng)處理表的記錄多達(dá)上幾十萬甚至幾百萬條的時候,運(yùn)行速度減慢的效果會更加明顯。而如果在編制程序時,善于利用臨時列表的話,就可以大大的提高系統(tǒng)的運(yùn)行速度和處理時間,從而減少甚至忽略因處理表記錄過多對系統(tǒng)運(yùn)行處理性能的影響。所謂的臨時列表,是系統(tǒng)在運(yùn)行時存放在臨時數(shù)據(jù)庫的文件,這些文件會在系統(tǒng)完成數(shù)據(jù)處理之后被自動刪除。
2 優(yōu)化SQL 的語句
2.1 充分利用索引,減少全表掃描
優(yōu)化SQL 語句,實(shí)質(zhì)上就是保證正確結(jié)果的前提下,通過對索引的充分利用,采用服務(wù)器可以識別的語句來進(jìn)行索引,以減少對服務(wù)器的全表掃描并避免返回沒有限定條件的信息。
例如下面的兩條SQL 語句:
語句一:select 班級,姓名from T1 where 姓名not in(select 姓名fromT2);
語句二:select 班級,姓名from T1 where not exists(select 班級FROM T2 where T2 . 姓名=T1 姓名);
在上述的語句一和語句二中,兩者的的結(jié)果是一樣的,但是由于語句一沒有使用在T2 表上建立的姓名索引,因此SQLServe 在執(zhí)行的時候就會掃描整個T2 表。而語句二中的子查詢因?yàn)槭褂昧寺?lián)合查詢,所以SQL Serve 在執(zhí)行的時候就只是掃描T2 表的部分?jǐn)?shù)據(jù)。通過利用姓名索引,使語句二比語句一的檢索效率要高許多,通過語句的優(yōu)化,也使SQL Serve 數(shù)據(jù)庫的系統(tǒng)性能得到了優(yōu)化。同時,還要避免在表達(dá)式中使用條件列。例如“where 成績='90‘”以及“where 成績/100 > 0.8”這兩個條件列。在這里,SQL 的條件語句都有著恰當(dāng)?shù)乃饕?,但是?zhí)行語句的速度卻非常的慢,這是因?yàn)闂l件列中“where”字句對列的所有操作結(jié)果,都是SQL Serve 在執(zhí)行語句時通過對每列的計(jì)算的來的,所以SQL 要對全表進(jìn)行掃描。而將上面兩個條件列語句改成“where 成績like'90’”和“where 成績> 80”,則SQL Serve 執(zhí)行語句的速度則會明顯快很多。
再者,在SQL 語句中,還要避免使用不相等或者NULL 條件列,例如“where 成績is null”和“where 成績≠ 80”,因?yàn)檫@樣的話雖然在查詢列例有索引,但這個索引卻無法被使用。
還有的話,在使用like 條件列時,要盡量避免賦值變量或者是以“%”作為開始,因?yàn)檫@種情況下索引也無法被使用,如“where姓名like'%Jam' ”和“where 班級like var_ 班級”.
2.2 避免使用in、not in 語句
在SQL 語句中,要避免用到in、not in 的語句,而采用exists、not exists 語句的效果要比使用in、not in 語句的效果好得多。
2.3 慎用聯(lián)合查詢以及查詢次序
對于視圖的查詢,是可以將其分解,變成對數(shù)據(jù)表的直接數(shù)據(jù)查詢。而在進(jìn)行數(shù)據(jù)查詢時,程序員首先要查詢的往往是主表,而由于主表需要掃描整個表數(shù)據(jù),因此應(yīng)該將主表的數(shù)據(jù)量控制為的,主表的查詢列范圍也要比從表的查詢列范圍小。主表和從表之間的聯(lián)合要結(jié)合數(shù)據(jù)量的大小以及索引條件來考慮。
3 結(jié)語
SQL Server 數(shù)據(jù)庫系統(tǒng)系能的優(yōu)化是一個復(fù)雜的系統(tǒng)工程,其貫穿了數(shù)據(jù)庫系統(tǒng)的整個生命周期,從系統(tǒng)的開發(fā)、到系統(tǒng)的設(shè)計(jì)、到系統(tǒng)的維護(hù),每個環(huán)節(jié)和每個步驟都要注意,一點(diǎn)小小的失誤都會影響SQL Server 數(shù)據(jù)庫系統(tǒng)的終性能。因此要重視對SQL Server 數(shù)據(jù)庫系統(tǒng)的優(yōu)化意識,要根據(jù)用戶軟件和硬件的實(shí)際配置、對于系統(tǒng)的性能和作用的要求、以及應(yīng)用程序的設(shè)計(jì)等情況來采取合適的優(yōu)化策略。而對于系統(tǒng)的網(wǎng)絡(luò)瓶頸、性能要求以及事務(wù)特點(diǎn)和儲存結(jié)構(gòu)等都要有深刻的認(rèn)識和理解,并以其作為系統(tǒng)性能優(yōu)化的基礎(chǔ)。在進(jìn)行系統(tǒng)開發(fā)的時候,還要結(jié)合實(shí)際情況對系統(tǒng)進(jìn)行性能權(quán)衡優(yōu)化,以提高系統(tǒng)的整體性能。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.udpf.com.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 什么是氫氧燃料電池,氫氧燃料電池的知識介紹2025/8/29 16:58:56
 - SQL核心知識點(diǎn)總結(jié)2025/8/11 16:51:36
 - 等電位端子箱是什么_等電位端子箱的作用2025/8/1 11:36:41
 - 基于PID控制和重復(fù)控制的復(fù)合控制策略2025/7/29 16:58:24
 - 什么是樹莓派?一文快速了解樹莓派基礎(chǔ)知識2025/6/18 16:30:52
 









