【正文】
工作,以每秒鐘的事務(wù)量(tps)表示;該值越高越好。現(xiàn)在考慮一個為客戶預(yù)定體育比賽門票的公司。系統(tǒng)響應(yīng)時間的實質(zhì)就是終端用戶為等待后臺事務(wù)處理所花費時間。對于那些對響應(yīng)時間有嚴(yán)格要求的系統(tǒng),必須采取不同的方法對系統(tǒng)進(jìn)行調(diào)整。像是否在系統(tǒng)范圍內(nèi)采用線程服務(wù)器這樣的配置問題就是這一階段需要考慮的問題。應(yīng)用程序的執(zhí)行最終將歸結(jié)為數(shù)據(jù)庫中的SQL語句執(zhí)行,因此SQL語句的執(zhí)行效率最終決定了數(shù)據(jù)庫的性能。所以邏輯數(shù)據(jù)庫設(shè)計至少應(yīng)滿足規(guī)范化的前3級標(biāo)準(zhǔn):第1規(guī)范:沒有重復(fù)的元組或多值的列。,特別是對于被索引的列更是如此。這不但影響著數(shù)據(jù)庫的運行效率,也增大數(shù)據(jù)庫的維護(hù)難度。水平分區(qū)將表分為多個表。在這種情況下,可考慮將數(shù)據(jù)分成四個區(qū),每個區(qū)只包含一個季度的數(shù)據(jù)。創(chuàng)建文件組后,再使用ALTER DATABASE將文件添加到該文件組中。代表每個邊界值在局部的哪一邊。) 創(chuàng)建分區(qū)函數(shù)后,必須將其與分區(qū)方案相關(guān)聯(lián),以便將分區(qū)指向至特定的文件組。創(chuàng)建分區(qū)表的代碼如下: CREATE TABLE SendSMSLog([ID][int]IDENTITY(1,1)NOT NULL,[IDNum][nvarchar](50)NULL,[SendContent][text]NULL[SendDate][datetime]NOTNULL,)ON SendSMSPS(SendDate) 系統(tǒng)運行一段時間或者把以前的數(shù)據(jù)導(dǎo)入分區(qū)表后,我們需要查看數(shù)據(jù)的具體存儲情況,即每個分區(qū)存取的記錄數(shù),那些記錄存取在那個分區(qū)等。應(yīng)用程序的優(yōu)化通??煞譃閮蓚€方面:源代碼和SQL語句。表中的每一行均用一個ROWID來標(biāo)識,ROWID告訴數(shù)據(jù)庫這一行的準(zhǔn)確位置(指出行所在的文件、該文件中的塊、該塊中的行地址)。 ,一般使用的原則為: (1)為主鍵所在的列創(chuàng)建索引。 (6)在聚集索引中,避免包括不必要的列,盡可能使用較小的數(shù)據(jù)類型,例如用VARCHAR代替CHAR。索引優(yōu)化向?qū)г赟QL Server 2000事件探查器的“工具”菜單下可以找到。 一旦索引優(yōu)化向?qū)Х治鐾旯ぷ髫?fù)載后(如果工作負(fù)載很大,這會運行幾個小時那么長),基于對工作負(fù)載的分析,提出最佳的聚集/非聚集索引建議。例如float和int、char和varchar、binary和varbinary是不兼容的。B%39??梢杂肊XISTS代替。見如下例子: SELECT * FROM T1 WHERE NAME LIKE‘%L%’ SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’ SELECT * FROM T1 WHERE NAME LIKE‘L%’ 即使NAME字段建有索引,前兩個查詢依然無法利用索引完成加快操作,引擎不得不對全表所有數(shù)據(jù)逐條操作來完成任務(wù)。例如:SELECT * FROM customer WHERE zipcode LIKE“98___” 即使在zipcode字段上建立了索引,在這種情況下也還是采用順序掃描的方式。or city=39。 如果dept列建有索引則查詢2可以部分利用索引,查詢1則不能。 (3)盡量最小化對于含有UPDATE觸發(fā)器的表的UPDATE操作。查詢優(yōu)化的重點環(huán)節(jié)是使得數(shù)據(jù)庫服務(wù)器少從磁盤中讀數(shù)據(jù)以及順序讀頁而不是非順序讀頁。主鍵為商品編號。5 優(yōu)化實例 該商品訂單管理數(shù)據(jù)庫因為主要是用于測試,所以它的數(shù)據(jù)量并不是很大,但是若將該數(shù)據(jù)庫應(yīng)用系統(tǒng)應(yīng)用到實際的環(huán)境中,那么記錄數(shù)會隨著時間而增長。水平分區(qū)將表分為多個表。任何需要特定廠家商品信息的查詢只需引用相應(yīng)廠家的表就行了。會員39。A39。即使在上述表和字段上創(chuàng)建了索引,系統(tǒng)使用這些索引的機(jī)率也非常小。 *FROM orderinfo WHERE ordernumber/2=100 ,執(zhí)行計劃如圖53。20051139。圖55 使用子查詢的SQL語句的執(zhí)行計劃 (2)select distinct ,ame,csex,cage from Products P,Productsinfo PP,orderinfo oo,orders o,customerinfo ee,customer e where = and = and = and = and = and crank=39。and ordertime=39。SQL SERVER數(shù)據(jù)庫在國內(nèi)外獲得了廣泛應(yīng)用。最后提出一個針對SQL SERVER數(shù)據(jù)庫的系統(tǒng)性能總體調(diào)整策略。 同時感謝對本文進(jìn)行評審和提出寶貴意見的各位老師。參考文獻(xiàn)[1] Dennis Shasha 著, 孟小峰包括對性能調(diào)整與優(yōu)化的概念、性能優(yōu)化的主要方面、常用的SQL SERVER數(shù)據(jù)庫性能優(yōu)化工具進(jìn)行了討論。雖然優(yōu)化器有時可以自動將子查詢“扁平化”,并且用常規(guī)連接或外連接代替。and pkind=39。江中制藥39。下面我們就來測試一下這兩條語句的執(zhí)行成本。 在創(chuàng)建適當(dāng)?shù)乃饕?,查詢語句一的執(zhí)行計劃如圖52所示,該查詢的執(zhí)行成。 通過對系統(tǒng)進(jìn)行分析,發(fā)現(xiàn)可以利用索引技術(shù)來加快檢索速度,提高系統(tǒng)性能。200513139。該實驗方案方要作為其他優(yōu)化方案的參照物。 水平分區(qū)常用的方法是根據(jù)時期和使用對數(shù)據(jù)進(jìn)行水平分區(qū)。當(dāng)表和索引變得非常大時,分區(qū)可以將數(shù)據(jù)分為更小、更容易管理的部分來提高系統(tǒng)的運行效率。訂單號為其主鍵,客戶號為其外鍵。主鍵為客戶編號。 上面我們提到的是一些基本的提高查詢速度的注意事項,但是在更多的情況下,往往需要反復(fù)試驗比較不同的語句以得到最佳方案。SELECT INOT語句會導(dǎo)致表鎖定,阻止其他用戶訪問該表。prod’ UNION ALL SELECT employeeID,firstname,lastname FROM names WHERE city= 39。例如: SELECT CUSTNAME,……OTHER COLUMNS FROM CUST,RCVBLES WHERE = AND 0 AND “98000” ORDER BY ,且這個查詢要被執(zhí)行多次而不止一次,則可以把所有未付款的客戶找出來放在一個視圖中,并按客戶的名字進(jìn)行排序: CREATE VIEW AS SELECT ,……other columns FROM CUST,RCVBLES WHERE = AND 0 ORDER BY 然后以下面的方式在視圖中查詢: SELECT*FROM V_CUST_RCVLBES WHERE postcode=“98000” 視圖中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁盤I/O,所以查詢工作量可以得到大幅減少。 盡管在所有的檢查列上都有索引,但某些形式的WHERE子句強迫優(yōu)化器使用順序存取。xxx39。 、NOT EXISTS子句。 ,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。 ,保證在實現(xiàn)功能的基礎(chǔ)上,盡量減少對數(shù)據(jù)庫的訪問次數(shù);通過搜索參數(shù),盡量減少對表的訪問行數(shù),最小化結(jié)果集,從而減輕網(wǎng)絡(luò)負(fù)擔(dān);能夠分開的操作盡量分開處理,提高每次的響應(yīng)速度;在數(shù)據(jù)窗口使用SQL時,盡量把使用的索引放在選擇的首列。工作負(fù)載的創(chuàng)建必須能體現(xiàn)一段時間內(nèi)每天數(shù)據(jù)庫使用的情況。 在創(chuàng)建索引后,必須維護(hù)索引以確??梢垣@得最佳的性能。不要在在查詢很少引用的列上創(chuàng)建索引。 從大多數(shù)系統(tǒng)應(yīng)用實例來看,查詢操作在各種數(shù)據(jù)庫的操作中,所占的比重最大。程序員可以通過查看查詢計劃來比較各種實現(xiàn)方案,并選出最優(yōu)的實現(xiàn)方案。 SQL查詢語句的優(yōu)化 數(shù)據(jù)庫的優(yōu)化通??梢酝ㄟ^對網(wǎng)絡(luò)、硬件、操作系統(tǒng)、數(shù)據(jù)庫參數(shù)和應(yīng)用程序的優(yōu)化來進(jìn)行。創(chuàng)建分區(qū)方案的代碼如下: CREATE PARTITION SCHEME[SendSMSPS] AS PARTITION[SendSMSPF] TO ([FG1],[FG2],[FG3],[FG4]) 建立好分區(qū)函數(shù)和分區(qū)方案后,就可以創(chuàng)建分區(qū)表了。39。C:\DeanData\39。每個文件組可以由一個或多個文件構(gòu)成,而每個分區(qū)必須映射到一個文件組。而垂直分區(qū)則是將原始表分成多個只包含較少列的表。如果系統(tǒng)有多個CPU或是多個磁盤子系統(tǒng),可以通過并行操作獲得更好的性能。 Server段把文本或圖像列的數(shù)據(jù)存放在1個單獨的物理設(shè)備上可以提高性能。但表關(guān)系也許需要通過復(fù)雜的合并來處理,這樣會降低系統(tǒng)的性能。要在SQL Server方案中實現(xiàn)最優(yōu)的性能,最關(guān)鍵的是要有一很好的數(shù)據(jù)庫設(shè)計方案。這一階段需要對數(shù)據(jù)進(jìn)行仔細(xì)分析,避免數(shù)據(jù)冗余,同時要考慮合理分布數(shù)據(jù),以防止數(shù)據(jù)存取的擁擠,如是否使用數(shù)據(jù)庫的分區(qū)功能,以及對于經(jīng)常訪問的數(shù)據(jù)庫表是否需要建立局部還是全局索引等。在計劃階段就仔細(xì)地考慮性能調(diào)整工作,這會大大減輕系統(tǒng)運行后的性能調(diào)整工作。l 減少用戶等待時間,即減少用戶訪問同一數(shù)據(jù)庫資源的沖突率。在設(shè)計系統(tǒng)軟硬件規(guī)模和規(guī)劃系統(tǒng)能力時,我們是根據(jù)系統(tǒng)最忙碌的時間段來計算系統(tǒng)所要達(dá)到的吞吐量的。如果反應(yīng)時間長(壞),吞吐量或許高(好)。為有效地對系統(tǒng)進(jìn)行調(diào)整,必須遵循一套特定的步驟或方法,去調(diào)整和優(yōu)化系統(tǒng)中的所有組件,包括應(yīng)用、硬件與SQL SERVER。第六章總結(jié)全文,肯定了數(shù)據(jù)庫性能調(diào)整的應(yīng)用價值。使得能有效的使用SQL SERVER數(shù)據(jù)庫產(chǎn)品,將它的性能調(diào)整到更適合自己的需要。同時,SQL SERVER數(shù)據(jù)庫在國內(nèi)外也獲得了諸多成功應(yīng)用。數(shù)據(jù)庫建設(shè)是現(xiàn)代信息產(chǎn)業(yè)的基本建設(shè)工程,一個國家擁有多少自己的數(shù)據(jù)庫,能用數(shù)據(jù)庫提供多少服務(wù),是各國經(jīng)濟(jì)實力、文明程度和科技水平的重要標(biāo)志?;诖耍撐母鶕?jù)本人在實際工作中遇到的問題和平時對數(shù)據(jù)庫的使用經(jīng)驗,將數(shù)據(jù)庫設(shè)計、合理的索引添加以及SQL語句優(yōu)化等方面的性能調(diào)整與優(yōu)化問題作為主要研究內(nèi)容,對其進(jìn)行了深入地分析和討論,給出了一般情況下SQL SERVER數(shù)據(jù)庫應(yīng)用系統(tǒng)的性能調(diào)整策略及優(yōu)化方法。因此,基于數(shù)據(jù)庫系統(tǒng)的性能調(diào)整與優(yōu)化對于整個系統(tǒng)的正常運行起著至關(guān)重要的作用。最后,對SQL SERVER數(shù)據(jù)庫性能調(diào)整與優(yōu)化問題進(jìn)行了總結(jié)。隨著數(shù)據(jù)庫規(guī)模的不斷擴(kuò)大,數(shù)據(jù)庫系統(tǒng)的性能問題也越來越突出,數(shù)據(jù)庫應(yīng)用系統(tǒng)能否正常、高效地運行倍受關(guān)注,數(shù)據(jù)庫優(yōu)化技術(shù)方法的探索具有非常重要的意義。SQL SERVER數(shù)據(jù)庫服務(wù)器是高度可優(yōu)化的軟件產(chǎn)品,對SQL SERVER數(shù)據(jù)庫進(jìn)行性能調(diào)整與優(yōu)化具有非常重要的意義。第三章對性能優(yōu)化技術(shù)介紹。性能調(diào)整的一個主要目標(biāo)是消除瓶頸。提高系統(tǒng)的吞吐量也有兩種方法:l 在同樣的資源環(huán)境下做更多的工作(通過減少服務(wù)時間);l 通過減少總的響應(yīng)時間使工作做得更快。如果該公司的營業(yè)時間為每天8小時,并且在銷售市場體育比賽門票的第一天必須賣出25000張門票,那么該公司的門票預(yù)定系統(tǒng)的吞吐量必須等于或大于每小時3125筆事務(wù)。響應(yīng)時間通常也稱為用戶收到查詢正被處理的直觀確認(rèn)時刻所感知的時間長度。為了縮短系統(tǒng)響應(yīng)時間,可以使系統(tǒng)以遠(yuǎn)低于其實際吞吐能力的吞吐量運行或是將批理作業(yè)放在非營業(yè)時間內(nèi)處理。這樣設(shè)計者將性能要求同具體的業(yè)務(wù)需求直接聯(lián)系起來。3 性能優(yōu)化技術(shù)介紹一個數(shù)據(jù)庫系統(tǒng)的生命周期可以分成:設(shè)計、開發(fā)和成品三個階段。第2規(guī)范:每個非關(guān)鍵字段必須依賴于主關(guān)鍵字,不能依賴于1個組合式主關(guān)鍵字的某些組成部分。比如能使用smallint類型就不要用int類型