none
如何增進 view 的效能 RRS feed

  • 問題

  • 各位好, 想請問一下,不知道問法有沒有太籠統,

    1. 我的環境 SQL 2005 + windows 2003 server R2 x32 OR x64

    2. 我常使用 view,可能會有多個 table OUTER JOIN 或是 INNER JOIN,也會有 table 跟 view JOIN 的狀況

    3. 如果我針對 view 作統計的查詢,如 count 、SUM、巢狀的 Select 的話,整個查詢效率就很差,最後只好放棄 view,把相同資料寫在多個 table,以單一 table 作查詢,效率真的十萬八千里

     

    請問一下,是不是我的這種作業方式本來就不該使用 view,或是有沒有比較建議的方式,謝謝。

    2008年6月25日 上午 06:50

解答

  • 是可以針對 View 做 Index (也就是 indexed view),但是你自己都說了,多個 table 有 OUTER JOIN 或 INNER JOIN,這樣的資料量如果很可觀(百萬筆以上)的話,效率變慢是很正常的 ... View 畢竟不是 table,它不會儲存資料的,它只是把查詢做一點簡化,並且隱藏 table schema 而已,它在查詢時還是會把查詢指令送到各個 table。

     

    如果要使用 View 的話,就要先確保 View 本身的 SQL 指令效率要夠好,如果本身的 SQL 指令本身效率就差,那就算換到 View,問題一樣無法解決,所以你要自己先把 SQL 指令調到最佳狀態,再把它組合成 View,而且要限制傳回的資料量,否則光是 I/O 速度就可以拖慢整個查詢速度。

     

    用單一 table 查詢,也要注意索引的問題,如果沒有索引,再好的查詢指令也沒有用,TABLE SCAN 永遠存在。

    2008年6月25日 上午 07:12
    版主
  • 1.正規劃,正規劃錯了要有效率查詢就很難.

    2.資料量要小,只有必要的資訊才進去,不要垃圾入,垃圾出.

    3.索引要正確,不是叫你一推的索引,你要知道使用者怎麼去用,比如電話簿,中國人是用ㄅㄆㄇ去查,外國人用ABC去索引.

    4.View,觀點,使用者觀點,不同使用者,不同角色,不同觀點,你去撈資料方法也不同,比如銷售訂單對業務,對會計,對研發人員觀點不一樣,所以你要以第一點的正規劃,找個最接近的點直接取資料,比如研發人員是從產品查回銷售訂單項目,在去匯總銷售金額.業務人員可能以客戶去查銷售資料....一般來說,你要切的正確,Join,Subquery 層數越少越好,尤其避免自我Join 這可能造成遞回的產生.層數越多效能可能就成指數的下降.

    5.資料結構要清楚,Table 像 One To One ,One To More,More To More 就用Table 結構,Tree 狀結構,這種很多層的,像階級...避免用Table,不要像以前書寫的方式,找個老闆自我Join很多次才找到,像這種的直接用XML就好了,一行子令就能將父結點,子節點,孫結點,旁系...都找出.

    6.不要在AP用程序語言寫SQL做的事,也不要在Database 裡用SQL 去寫程序的Code.

    2008年6月25日 上午 07:54

所有回覆

  • 是可以針對 View 做 Index (也就是 indexed view),但是你自己都說了,多個 table 有 OUTER JOIN 或 INNER JOIN,這樣的資料量如果很可觀(百萬筆以上)的話,效率變慢是很正常的 ... View 畢竟不是 table,它不會儲存資料的,它只是把查詢做一點簡化,並且隱藏 table schema 而已,它在查詢時還是會把查詢指令送到各個 table。

     

    如果要使用 View 的話,就要先確保 View 本身的 SQL 指令效率要夠好,如果本身的 SQL 指令本身效率就差,那就算換到 View,問題一樣無法解決,所以你要自己先把 SQL 指令調到最佳狀態,再把它組合成 View,而且要限制傳回的資料量,否則光是 I/O 速度就可以拖慢整個查詢速度。

     

    用單一 table 查詢,也要注意索引的問題,如果沒有索引,再好的查詢指令也沒有用,TABLE SCAN 永遠存在。

    2008年6月25日 上午 07:12
    版主
  • 1.正規劃,正規劃錯了要有效率查詢就很難.

    2.資料量要小,只有必要的資訊才進去,不要垃圾入,垃圾出.

    3.索引要正確,不是叫你一推的索引,你要知道使用者怎麼去用,比如電話簿,中國人是用ㄅㄆㄇ去查,外國人用ABC去索引.

    4.View,觀點,使用者觀點,不同使用者,不同角色,不同觀點,你去撈資料方法也不同,比如銷售訂單對業務,對會計,對研發人員觀點不一樣,所以你要以第一點的正規劃,找個最接近的點直接取資料,比如研發人員是從產品查回銷售訂單項目,在去匯總銷售金額.業務人員可能以客戶去查銷售資料....一般來說,你要切的正確,Join,Subquery 層數越少越好,尤其避免自我Join 這可能造成遞回的產生.層數越多效能可能就成指數的下降.

    5.資料結構要清楚,Table 像 One To One ,One To More,More To More 就用Table 結構,Tree 狀結構,這種很多層的,像階級...避免用Table,不要像以前書寫的方式,找個老闆自我Join很多次才找到,像這種的直接用XML就好了,一行子令就能將父結點,子節點,孫結點,旁系...都找出.

    6.不要在AP用程序語言寫SQL做的事,也不要在Database 裡用SQL 去寫程序的Code.

    2008年6月25日 上午 07:54