SQL Server視圖運(yùn)行的提高與索引
以下的文章主要描述的是如何正確利用索引來對(duì)SQL Server視圖運(yùn)行的實(shí)際性能進(jìn)行提高,我們大家都知道出現(xiàn)SQL Server數(shù)據(jù)庫的視圖中包含Group By語句的情況,在***不要采用索引SQL Server視圖。
雖然Group By語句需要對(duì)數(shù)據(jù)進(jìn)行聚合操作。但是他是高基數(shù)度的數(shù)據(jù)聚合。高基數(shù)度表示健包含許多不同的值。如需要采用Group By語句對(duì)數(shù)以萬計(jì)的用戶數(shù)據(jù)進(jìn)行分組,則這個(gè)分組對(duì)象的數(shù)值會(huì)很大。這個(gè)用戶的數(shù)量就是基數(shù)度。
唯一鍵具有可能的***基數(shù)度,因?yàn)槊總€(gè)鍵具有不同的值。索引視圖通過減少查詢必須訪問的行數(shù)來提高性能。如果SQL Server視圖結(jié)果集中的行數(shù)像基表中的行數(shù)那么多,那么使用視圖獲得的性能收益微乎其微。
索引視圖的幾個(gè)典型應(yīng)用
筆者在這里根據(jù)自己的數(shù)據(jù)庫設(shè)計(jì)經(jīng)驗(yàn),談?wù)勊饕晥D的兩個(gè)主要應(yīng)用。希望這兩個(gè)例子能夠給大家?guī)硪欢ǖ膯l(fā)。
如某個(gè)商品零售企業(yè),其在不同的地方有多個(gè)零售門店。為了便于管理,不同的零售門店都采用獨(dú)立的數(shù)據(jù)庫表來記錄他們的銷售情況。到月底的時(shí)候,需要對(duì)各個(gè),門店的銷售記錄進(jìn)行匯總,最終要統(tǒng)計(jì)在一張表中。
此時(shí),該如何處理呢?通常情況下,是先對(duì)各個(gè)門店的銷售情況進(jìn)行匯總,統(tǒng)計(jì)出每個(gè)類別的銷售金額。然后再把各個(gè)表的內(nèi)容進(jìn)行連接,放在同一張報(bào)表中。如果從數(shù)據(jù)庫設(shè)計(jì)的角度講,那么就是先對(duì)每張銷售情況表進(jìn)行聚合操作,然后再利用Union語句把它們連接起來。Union語句就是將兩個(gè)SQL語句的結(jié)果合并起來。如要實(shí)現(xiàn)以上目的,我們可以通過SQL1 語句 Uinon SQL語句2這種方式實(shí)現(xiàn)目的。
但是,如果這些數(shù)據(jù)用于決策分析系統(tǒng),每次用到的時(shí)候都需要重新查詢,就會(huì)大大的增加數(shù)據(jù)庫的查詢負(fù)擔(dān)。為此,就要建立索引視圖。不過可惜的是,索引視圖不支持Uinon操作符。那該如何處理呢?通常情況下,筆者都是這么做的。
***步先對(duì)每個(gè)門店的銷售表進(jìn)行匯總統(tǒng)計(jì),此時(shí)可以利用索引視圖來提高查詢的速度。第二步再用SQL語句來查詢這幾個(gè)索引視圖中的數(shù)據(jù)并利用Uinon語句進(jìn)行連接。也就是說,不直接從數(shù)據(jù)庫基表中查詢數(shù)據(jù)進(jìn)行連接,而是從索引SQL Server視圖中進(jìn)行連接。這雖然不能夠提高Uinon操作的速度,但是因?yàn)槊總€(gè)表的聚合操作時(shí)間縮短了,那么其Uinon連接的時(shí)間相對(duì)來說,也就縮短了。
再如,現(xiàn)在各個(gè)門市店的銷售情況都是在獨(dú)立的SQL數(shù)據(jù)庫中記錄。然后在季末或者年末需要它們他們的數(shù)據(jù)連接起來。此時(shí),又該如何處理呢?基本上跟上面的操作步驟類似。***步統(tǒng)計(jì)每個(gè)數(shù)據(jù)庫中的銷售情況,對(duì)某些數(shù)據(jù)進(jìn)行匯總操作。
第二步就利用Union等操作符把它們的結(jié)果連接起來。但是由于索引視圖不能夠同時(shí)引用多個(gè)數(shù)據(jù)庫中的表,所以不能夠設(shè)計(jì)單個(gè)索引視圖來完成這項(xiàng)任務(wù)。筆者的做法是,先在每個(gè)數(shù)據(jù)庫中建立一張索引視圖,來統(tǒng)計(jì)這些銷售情況,即對(duì)每個(gè)數(shù)據(jù)庫單獨(dú)的執(zhí)行聚合操作。
然后再通過連接操作把它們的結(jié)果連接起來。這個(gè)跟上面的一樣,索引視圖并不能夠直接提高連接操作的性能。他也是通過縮短各個(gè)數(shù)據(jù)庫系統(tǒng)聚合操作的時(shí)間來實(shí)現(xiàn)縮短整個(gè)連接操作時(shí)間的目的。所以,其連接操作的總體速度會(huì)加快。
如何創(chuàng)建索引視圖
其實(shí),SQL Server視圖的創(chuàng)建非常簡單。只需要在創(chuàng)建視圖的時(shí)候,加入一個(gè)WITH SCHEMABINDING的關(guān)鍵字即可。所以,要?jiǎng)?chuàng)建索引視圖不難。其***的難度還在于數(shù)據(jù)庫工程師需要根據(jù)實(shí)際的情況,來判斷是否需要采用索引視圖。即需要應(yīng)用場景,來分析此時(shí)采用索引視圖能夠改善視圖的性能。
【編輯推薦】