陳潔+祝永健
【摘要】 隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)也不斷擴(kuò)展,數(shù)據(jù)量不斷增加,對(duì)數(shù)據(jù)庫(kù)性能進(jìn)行優(yōu)化,提高效率成為了數(shù)據(jù)庫(kù)應(yīng)用中的重要問(wèn)題。因此,本文以常用的SQL Server數(shù)據(jù)庫(kù)作為探討對(duì)象,從數(shù)據(jù)庫(kù)索引的有效利用、SQL語(yǔ)句的改善及SQL Server的分區(qū)三方面對(duì)SQL Server數(shù)據(jù)庫(kù)性能優(yōu)化提出分析意見(jiàn)。
【關(guān)鍵詞】 SQL Server 數(shù)據(jù)庫(kù) 性能優(yōu)化
隨著數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的不斷擴(kuò)展,數(shù)據(jù)庫(kù)用戶數(shù)量的不斷增多,需要處理的業(yè)務(wù)數(shù)據(jù)量在不斷增加,數(shù)據(jù)庫(kù)海量數(shù)據(jù)存儲(chǔ)在迅速增長(zhǎng),數(shù)據(jù)庫(kù)性能的好壞變得越來(lái)越重要。數(shù)據(jù)量的快速增長(zhǎng)是數(shù)據(jù)庫(kù)性能優(yōu)化研究的主要驅(qū)動(dòng)力,在當(dāng)前已有的軟硬件基礎(chǔ)之上,如何在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中獲得最大的吞吐量和提高系統(tǒng)的處理能力是目前數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的一個(gè)研究熱點(diǎn)。
一般情況下,數(shù)據(jù)庫(kù)的優(yōu)化指的就是查詢性能的優(yōu)化,讓數(shù)據(jù)庫(kù)對(duì)查詢的響應(yīng)盡可能的快。僅對(duì)數(shù)據(jù)庫(kù)系統(tǒng)本身而言,影響到查詢性能的因素從理論上來(lái)講包括數(shù)據(jù)庫(kù)參數(shù)設(shè)置,索引,分區(qū),SQL語(yǔ)句。
一、有效的利用索引
索引在數(shù)據(jù)庫(kù)的查詢優(yōu)化中起著至關(guān)重要的作用,一個(gè)數(shù)據(jù)庫(kù)索引的好與壞,其查詢性能相差很多倍。如何選擇索引可顯著影響所產(chǎn)生的磁盤(pán) I/O,并因而影響查詢性能。常用的索引有聚集索引、非聚集索引,對(duì)于非聚集索引,選擇性很重要,因?yàn)槿绻谥挥猩倭课ㄒ恢档拇笮捅砩蟿?chuàng)建非聚集索引,使用非聚集索引將不會(huì)節(jié)省數(shù)據(jù)檢索中的 I/O。因?yàn)閿?shù)據(jù)庫(kù)中的索引都注重一種比較性,這樣它可以快速的確定范圍,定位位置,例如,某表的性別字段,非男即女,不具有可比性,如果以它為非聚集索引,查詢的時(shí)候也只能一個(gè)個(gè)節(jié)點(diǎn)去比較。
在這種情況下產(chǎn)生的 I/O 可能比對(duì)表進(jìn)行連續(xù)掃描所產(chǎn)生的 I/O 多得多。比較適合非聚集索引的有票據(jù)編號(hào)、唯一的客戶編號(hào)、社會(huì)安全號(hào)碼和電話號(hào)碼,簡(jiǎn)單來(lái)說(shuō),就是基于某種可比較的,有規(guī)律的數(shù)據(jù)。
索引對(duì)于檢索性能的提高有一定的幫助,但是更多的索引或是不正確的一定程度上會(huì)導(dǎo)致系統(tǒng)低效。由于用戶在每次向表中添加一個(gè)索引時(shí),數(shù)據(jù)庫(kù)就得相對(duì)的做更多的工作。太多的索引甚至?xí)a(chǎn)生索引碎片。因此,我們才需要建立一個(gè)“適當(dāng)”的索引體系,尤其是在創(chuàng)建聚集索引的時(shí)候,更應(yīng)該精益求精,確保數(shù)據(jù)庫(kù)能夠得到高性能的發(fā)揮。
二、有效改善SQL語(yǔ)句
SQL的語(yǔ)句大概有編譯優(yōu)化、執(zhí)行、取值三個(gè)階段,而第一階段編譯優(yōu)化絕大多數(shù)情況下都要花掉60%的時(shí)間,所以變量的綁定是尤為重要的,SQL Server數(shù)據(jù)庫(kù)有緩存區(qū),存放一些最近使用過(guò)的SQL語(yǔ)句,當(dāng)有一條SQL語(yǔ)句到達(dá)數(shù)據(jù)庫(kù)服務(wù)器時(shí),首先數(shù)據(jù)庫(kù)會(huì)搜索緩存區(qū),看它是否存在可以重用的SQL語(yǔ)句,如果存在,可以不用編譯優(yōu)化,因?yàn)榫彺鎱^(qū)里都是編譯優(yōu)化好了的SQL語(yǔ)句,直接可以執(zhí)行,節(jié)約很多時(shí)間。
如果沒(méi)有發(fā)現(xiàn)可以重用的SQL語(yǔ)句,則必須要完全經(jīng)過(guò)語(yǔ)句編譯分析,優(yōu)化計(jì)劃,安全檢查等過(guò)程,這不僅僅會(huì)大量耗費(fèi)CPU功率,而且還在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi)鎖住了一部分?jǐn)?shù)據(jù)庫(kù)緩存,這樣執(zhí)行SQL語(yǔ)句的人越多,等待的時(shí)間越長(zhǎng),系統(tǒng)的性能會(huì)大幅度的下降。
三、合理利用SQL Server的分區(qū)
SQL Server的分區(qū)在一些超大型的表中是有著非常重要的作用。分區(qū)是邏輯上的一種區(qū)分,在數(shù)據(jù)訪問(wèn)的情況下,由于一個(gè)表就是一個(gè)整體,所以也就是對(duì)整個(gè)表或整個(gè)表的索引進(jìn)行了訪問(wèn),所謂分區(qū),通俗點(diǎn)講,就是把表按一定的規(guī)律劃分成更小的邏輯單位,在進(jìn)行數(shù)據(jù)訪問(wèn)的時(shí)候,不以表為單位進(jìn)行訪問(wèn),而是在表的基礎(chǔ)上,判斷數(shù)據(jù)在哪個(gè)分區(qū),然后對(duì)特定的分區(qū)進(jìn)行訪問(wèn)。正確的分區(qū)對(duì)于提高查詢性能有很大的作用。例如,有一個(gè)非常大的表,存儲(chǔ)了一些銷(xiāo)售記錄,現(xiàn)在查詢總是按銷(xiāo)售季度來(lái)執(zhí)行這個(gè)查詢,而每個(gè)銷(xiāo)售季度包含幾十萬(wàn)個(gè)記錄,通常你只是要查詢這個(gè)數(shù)據(jù)集的一個(gè)相當(dāng)小的數(shù)據(jù),但是給予銷(xiāo)售季度的檢索卻的確是不太可行的。
這個(gè)索引可能指向無(wú)數(shù)個(gè)記錄,而以這種方式執(zhí)行索引范圍掃描是可怕的。為了處理許多查詢?nèi)蝿?wù),系統(tǒng)需要執(zhí)行全表掃描,但是結(jié)果卻必須掃描幾百萬(wàn)個(gè)記錄,其中絕大部分不使用我們的查詢?nèi)蝿?wù)。使用智能分區(qū)方案,就可以按季度隔離數(shù)據(jù)。這樣當(dāng)我們?yōu)槿我庵付ǖ募径热ゲ樵償?shù)據(jù)時(shí),結(jié)果將只是掃描那個(gè)季度的數(shù)據(jù)。這是所有可能的解決方案中最好的方案。
數(shù)據(jù)庫(kù)優(yōu)化是一個(gè)很廣的范圍,涉及到的東西也比較多,并且每個(gè)特定的數(shù)據(jù)庫(kù),其具體的優(yōu)化過(guò)程也是不一樣的。因?yàn)閮?yōu)化的很大一部分最終都要跟具體的數(shù)據(jù)庫(kù)系統(tǒng)細(xì)節(jié)打交道,在此只能就常用的數(shù)據(jù)庫(kù)以及經(jīng)常用到的的東西進(jìn)行一些分析,以期使數(shù)據(jù)庫(kù)系統(tǒng)的效率得到提升,方便我們的使用。
參 考 文 獻(xiàn)
[1]楊柳. SQL SERVER 數(shù)據(jù)庫(kù)的性能分析與優(yōu)化策略研究[J]. 科技創(chuàng)新導(dǎo)報(bào)2011,(1):15-19.
[2]劉芬. 關(guān)于SQL數(shù)據(jù)庫(kù)的性能優(yōu)化問(wèn)題的研究[J]. 軟件. 2012(06)