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