台灣最大程式設計社群網站
線上人數
714
 
會員總數:245973
討論主題:189551
歡迎您免費加入會員
討論區列表 >> MS SQL >> 「檢視表」的迷思?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
「檢視表」的迷思?
價值 : 100 QP  點閱數:13261 回應數:7
樓主

荔枝
中級專家
2677 787
10036 2628
發送站內信

捐贈 VP 給 荔枝
對於「檢視表」,我一直有種「用它是否有錯」的感覺,

因為,它的優點雖然是「方便我們在寫SQL查詢式時,不需要寫一大串JOIN的資料表,只要將它們組合成一個檢視表即可」!

但問題是,將檢視表用在程式中的SQL查詢式時,例如:

SELECT xxx,ooo FROM View1 WHERE v_date BETWEEN '2013/6/1' AND '2013/6/2'

看起來,雖然有經過WHERE條件的篩選,但是,它是不是「其實是先經過了一個"完全沒有篩選"的"子查詢"」,然後取回了「全部的資料」再給「WHERE」來篩出範圍內的資料呢?

如果原理真的是這樣,那檢視表不是應該少用為妙嗎???......因為一用它就會產生效能問題????

雖然說,也可以對檢視表做「索引」,但問題是這樣做的話,檢視表就會另佔空間,且對於檢視表中的資料表在「INSERT、UPDATE」時不是會更費時嗎?

所以,我對於檢視表,一直存在疑問,它除了「寫起來比較方便」之外,似乎一無是處,還會是效能殺手!??

請教大家,謝謝


本篇文章發表於2013-11-01 14:22
1樓
最有價值解答

小君
捐贈 VP 給 小君 檢舉此回應
View 的架構實際上就是一個子查詢
而其內容的執行皆是動態解讀及編譯成執行計劃,之後方能執行!
縱使此 View 常常被查詢使用,也只是依賴執行計劃快取來提升一些效率,
所以其效能還是遠遠不及預先編譯好的語法或預存程序

結論是 View 還是少用為妙!
本篇文章回覆於2013-11-07 19:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

pilipala
檢舉此回應

看起來,雖然有經過WHERE條件的篩選,但是,它是不是「其實是先經過了一個"完全沒有篩選"的"子查詢"」,然後取回了「全部的資料」再給「WHERE」來篩出範圍內的資料呢?


View 是一個虛擬 Table;MSDN 檢視 http://msdn.microsoft.com/zh-tw/library/ms190174.aspx
Query Optimzer 接收到 T-SQL 後會尋找"最低成本執行計畫"來跑,即使是原 PO 所舉例情況也是一樣

雖然說,也可以對檢視表做「索引」,但問題是這樣做的話,檢視表就會另佔空間,且對於檢視表中的資料表在「INSERT、UPDATE」時不是會更費時嗎?


這是對於效能與維護成本的考量,沒有對錯,請依自身需求去取捨

所以,我對於檢視表,一直存在疑問,它除了「寫起來比較方便」之外,似乎一無是處,還會是效能殺手!??


使用檢視的實例 http://msdn.microsoft.com/zh-tw/library/ms188250%28v=sql.105%29.aspx

而其內容的執行皆是動態解讀及編譯成執行計劃,之後方能執行!
縱使此 View 常常被查詢使用,也只是依賴執行計劃快取來提升一些效率,
所以其效能還是遠遠不及預先編譯好的語法或預存程序


這篇之前討論,剛好呼應小君大所說的情況
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20110413183130YJF&fumcde=FUM20041006152735ZFS
本篇文章回覆於2013-11-08 11:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

荔枝
捐贈 VP 給 荔枝 檢舉此回應
謝謝小君大大、pilipala大大,

我發覺,還是直接存取資料表,不要用檢視表,這樣資料表的索引才能被使用到。

若所言有誤請指正,謝謝
本篇文章回覆於2013-11-24 21:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

pilipala
檢舉此回應
利用 AdventureWorks 的 [Sales].[SalesOrderHeader] 來說明



從下述三種 TSQL 語法的執行計畫計可以看出,Query Optimizer 所選用的最低成本執行計畫是完全一樣的
TSQL2 不會把全部的資料抓出來再進行篩選
TSQL3 也不會因為 View 而不使用 Index




本篇文章回覆於2013-11-25 08:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

荔枝
捐贈 VP 給 荔枝 檢舉此回應
謝謝pilipala大大,我後來自己也試了一下,的確是沒有差別,

但是......我有些程式的寫法本來是直接用檢視表來查詢,效能非常不佳

自從我把寫法改成「拆開檢視表」,也就是直接INNER JOIN一堆基底資料表的寫法後,效能有明顯變好,

所以..................真不知道是什麼原因??

本篇文章回覆於2013-11-27 14:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

pilipala
檢舉此回應

觀察執行計畫才有機會找出真正的原因 ~~ ^^ ~~
本篇文章回覆於2013-11-27 15:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

Js.Chang
檢舉此回應
個人小小看法

View 的確就是"View"

它可以視觀點/用途/報表的特性不同,以客製化好一些資料集合
那麼前端UI在取得這些資料時,就可以以很簡單的表達方法去取得.
另外若基層資料結構改變,程式可以不用改,只改View 即可.

實務上還有一個好處,有時要在ONLINE的環境下增修一些欄位或變更時,不需要重上程式碼
直接改VIEW即可 (但你最好還是有地方先確認過你的VIEW Code 沒錯誤)
本篇文章回覆於2017-04-24 09:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.