天地(常州)自動(dòng)化股份有限公司 馬汝超
?
Sql Server數(shù)據(jù)庫(kù)優(yōu)化技術(shù)方案
天地(常州)自動(dòng)化股份有限公司 馬汝超
【摘要】本文主要探討了提高SQL Server數(shù)據(jù)庫(kù)性能用到的一些數(shù)據(jù)庫(kù)優(yōu)化技術(shù),其中包括物理布局、處理器關(guān)聯(lián)、內(nèi)存匹配、表和索引分區(qū)和數(shù)據(jù)壓縮等。
【關(guān)鍵詞】SQL Server;性能;優(yōu)化
隨著全球信息體系和網(wǎng)絡(luò)智能化的發(fā)展,信息資源日益成為重要的生產(chǎn)要素,而快速處理這些日益遞增的龐大數(shù)據(jù),必然要充分運(yùn)用數(shù)據(jù)庫(kù)技術(shù)。SQL Server作為企業(yè)級(jí)數(shù)據(jù)庫(kù)在實(shí)際應(yīng)用中發(fā)揮著重要作用。但數(shù)據(jù)庫(kù)的響應(yīng)速度在其使用過(guò)程中影響著整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)乃至其上層應(yīng)用系統(tǒng)的性能,這對(duì)數(shù)據(jù)庫(kù)有了更高的性能要求。因此如何運(yùn)行數(shù)據(jù)庫(kù)優(yōu)化技術(shù)來(lái)提高其性能是一個(gè)重要的課題。
數(shù)據(jù)庫(kù)文件的物理布局直接影響到數(shù)據(jù)庫(kù)管理系統(tǒng)的I/O性能。在數(shù)據(jù)庫(kù)使用過(guò)程中,往往遇到計(jì)算機(jī)CPU占用率低但數(shù)據(jù)庫(kù)性能差的情況發(fā)生,此問(wèn)題主要原因往往來(lái)源于磁盤I/O瓶頸。因?yàn)镃PU處理速度遠(yuǎn)遠(yuǎn)高于磁盤I/O的速度,當(dāng)進(jìn)行大量數(shù)據(jù)查詢等操作時(shí),處理器要從負(fù)載過(guò)重的物理磁盤中讀取數(shù)據(jù),此時(shí)要排隊(duì)等待磁盤子系統(tǒng)中未決數(shù)據(jù)請(qǐng)求響應(yīng),從而引起上述低性能情況的發(fā)生。因此合理安排數(shù)據(jù)庫(kù)文件的物理布局至關(guān)重要。
Sql Server數(shù)據(jù)庫(kù)由主數(shù)據(jù)文件(.mdf)、輔助文件(.ndf)以及事務(wù)日志文件(.ldf)組成,并存儲(chǔ)在物理磁盤或磁盤陣列邏輯單元(LUN)中。為了使系統(tǒng)能更快的運(yùn)行,應(yīng)將數(shù)據(jù)文件和日志文件放到單獨(dú)或?qū)S玫奈锢鞮UN上,將很少使用的數(shù)據(jù)保存在較慢的物理LUN上。另外Tempdb作為速度最快的動(dòng)態(tài)數(shù)據(jù)庫(kù),應(yīng)將其主數(shù)據(jù)文件和日志文件放置在專用或快速I/O子系統(tǒng)中以得到好的性能。
處理器關(guān)聯(lián)將數(shù)據(jù)庫(kù)線程運(yùn)行在指定的處理器上,通過(guò)消除重新加載不同處理器之間的線程遷移活動(dòng),來(lái)提高數(shù)據(jù)庫(kù)系統(tǒng)性能。關(guān)于處理器關(guān)聯(lián)Sql Server提供了關(guān)聯(lián)掩碼和關(guān)聯(lián)I/O掩碼兩種配置選項(xiàng),其主要目的是為了將數(shù)據(jù)庫(kù)實(shí)例限制在處理器子集上運(yùn)行。關(guān)聯(lián)掩碼選項(xiàng)用于動(dòng)態(tài)控制CPU關(guān)聯(lián),可以按需啟動(dòng)和關(guān)閉用于在數(shù)據(jù)庫(kù)中綁定進(jìn)程線程的CPU計(jì)劃程序。但當(dāng)服務(wù)器運(yùn)行條件改變時(shí),可能需要重新調(diào)整關(guān)聯(lián)掩碼配置。關(guān)聯(lián)I/O掩碼選項(xiàng)將數(shù)據(jù)庫(kù)磁盤 I/O與指定的CPU子集綁定。在高端數(shù)據(jù)庫(kù)聯(lián)機(jī)事務(wù)處理環(huán)境中,此擴(kuò)展可以提高數(shù)據(jù)庫(kù)線程執(zhí)行I/O的性能。如果數(shù)據(jù)庫(kù)在專用服務(wù)器上運(yùn)行,建議允許數(shù)據(jù)庫(kù)使用所有處理器以確保獲得最佳性能。
由于訪問(wèn)內(nèi)存數(shù)據(jù)的速度比磁盤I/O子系統(tǒng)的速度快很多,高效使用內(nèi)存資源將對(duì)數(shù)據(jù)庫(kù)系統(tǒng)性能產(chǎn)生很大影響。由于系統(tǒng)內(nèi)存資源有限,過(guò)高占用內(nèi)存必然會(huì)導(dǎo)致操作系統(tǒng)和其他關(guān)鍵應(yīng)用服務(wù)內(nèi)存不足的現(xiàn)象發(fā)生。過(guò)少占用內(nèi)存,將導(dǎo)致操作系統(tǒng)開始將頁(yè)面錯(cuò)誤移動(dòng)到物理磁盤,從而增加磁盤I/O以及CPU資源的開銷。
SQL Server提供了最小服務(wù)器內(nèi)存和最大服務(wù)器內(nèi)存選項(xiàng)來(lái)控制數(shù)據(jù)庫(kù)內(nèi)存使用許可。數(shù)據(jù)庫(kù)服務(wù)進(jìn)程從啟動(dòng)開始其運(yùn)行內(nèi)存根據(jù)需要逐步增長(zhǎng),一旦內(nèi)存使用量超過(guò)最小內(nèi)存設(shè)定值,數(shù)據(jù)庫(kù)將不會(huì)釋放任何低于該量的內(nèi)存。最大服務(wù)器內(nèi)存則設(shè)置內(nèi)存上限,它會(huì)阻止數(shù)據(jù)庫(kù)占用過(guò)多內(nèi)存。數(shù)據(jù)庫(kù)用戶在配置相關(guān)內(nèi)存時(shí),需要考慮操作系統(tǒng)和其他關(guān)鍵應(yīng)用服務(wù)要有足夠的內(nèi)存。在滿足這一前提下,讓數(shù)據(jù)庫(kù)使用盡可能多的內(nèi)存,并保證內(nèi)存使用數(shù)量的穩(wěn)定性。
通常我們建立數(shù)據(jù)庫(kù)表時(shí),往往將表數(shù)據(jù)存放在一個(gè)文件里。但當(dāng)這些表或數(shù)據(jù)庫(kù)達(dá)到一定規(guī)模時(shí),就難以進(jìn)行數(shù)據(jù)庫(kù)維護(hù)、備份還原等操作。為了解決超大表的使用與維護(hù)問(wèn)題,數(shù)據(jù)庫(kù)引入了分區(qū)技術(shù)。分區(qū)是一種物理數(shù)據(jù)庫(kù)設(shè)計(jì)技術(shù),主要是將大型的對(duì)象分成更小的塊,其主要目的是為了在特定的SQL操作中減少數(shù)據(jù)讀寫的總量以縮減響應(yīng)時(shí)間。
分區(qū)的基本單位是行,但必須在單個(gè)數(shù)據(jù)庫(kù)內(nèi)進(jìn)行操作。使用分區(qū)時(shí),一張表的數(shù)據(jù)會(huì)被拆分成多個(gè)小文件,并按照指定的規(guī)則分放到不同的文件組單元中,還可以把這些小文件放在不同的磁盤中供多個(gè)處理器并行處理。當(dāng)對(duì)分區(qū)表數(shù)據(jù)進(jìn)行查詢等操作時(shí),分區(qū)表將被視為單個(gè)邏輯實(shí)體,對(duì)數(shù)據(jù)庫(kù)用戶來(lái)講和訪問(wèn)普通表沒什么差別。
Sql Server數(shù)據(jù)庫(kù)提供了數(shù)據(jù)壓縮功能,并且啟用數(shù)據(jù)壓縮時(shí)無(wú)須修改應(yīng)用程序。數(shù)據(jù)壓縮可有效減少數(shù)據(jù)的占用空間和讀寫相同數(shù)據(jù)花費(fèi)的I/O等,以有效緩解I/O壓力。但由于數(shù)據(jù)在讀寫時(shí)需要壓縮和解壓縮,因此會(huì)消耗一定的CPU資源,但不代表在相同負(fù)載下,啟用數(shù)據(jù)壓縮會(huì)導(dǎo)致CPU使用率變高,某些操作會(huì)因?yàn)閿?shù)據(jù)頁(yè)數(shù)量的減少而降低CPU的消耗。
Sql Server數(shù)據(jù)庫(kù)可壓縮對(duì)象有:存儲(chǔ)為堆的整個(gè)表、存儲(chǔ)為聚集索引的整個(gè)表、整個(gè)非聚集索引、整個(gè)索引視圖、已分區(qū)表和已分區(qū)索引等。對(duì)于已分區(qū)表或索引,可為每個(gè)分區(qū)配置壓縮選項(xiàng)。
提高SQL Server數(shù)據(jù)庫(kù)性能,需要考慮多種因素。合理安排數(shù)據(jù)庫(kù)文件物理布局,可以有效減輕磁盤I/O子系統(tǒng)的負(fù)擔(dān),建議將數(shù)據(jù)庫(kù)主數(shù)據(jù)文件放在由快速磁盤構(gòu)成的物理LUN上,Tempdb文件放在快速I/O子系統(tǒng)中。合理設(shè)置或調(diào)整處理器關(guān)聯(lián)以及內(nèi)存匹配,但要避免產(chǎn)生負(fù)面影響。對(duì)數(shù)據(jù)庫(kù)中大型對(duì)象應(yīng)創(chuàng)建分區(qū),有助于數(shù)據(jù)庫(kù)維護(hù)以及實(shí)現(xiàn)多處理器并行處理。數(shù)據(jù)壓縮可以用來(lái)提高I/O性能,但不要過(guò)度的增加處理器負(fù)擔(dān)。
參考文獻(xiàn)
[1]Ann Bachrach, Daniel Yu, Darmadi Komo,等. SQL Server 2012新功能簡(jiǎn)介白皮書,2012.
[2][美]Adam Jorgensen Steven Wort.等.SQL Server 2012管理高級(jí)教程[M].宋沄劍,曹仰杰,譯.北京:清華大學(xué)出版社,2013.
[3]衛(wèi)琳.SQL Server2012數(shù)據(jù)庫(kù)應(yīng)用與開發(fā)教程[M].北京:清華大學(xué)出版社,2014.
[4][美]Paul Atkinson Robert Vieira.SQL Server2012編程入門經(jīng)典[M].王軍,牛志玲,譯.北京:清華大學(xué)出版社,2013.
馬汝超(1985-),男,河南商丘人,中國(guó)礦業(yè)大學(xué)本科畢業(yè),軟件工程師,現(xiàn)供職于天地(常州)自動(dòng)化股份有限公司,研究方向:從事軟件開發(fā)應(yīng)用工作。
作者簡(jiǎn)介: