[SQL SERVER]單一寬資料表
這篇主要是分享寬資料表設計對效能影響是否明顯,
一般為了要減少join頻率,可能會在單一資料表上設計過多欄位(提高查詢效能),
這樣的設計在ERP上很常見(如SAP、Oracle),因為ERP需要一次呈現較多資料,
這樣的方式較省I/O,但我個人還是不太喜歡資料表過寬,當然凡事都沒有絕對,
我還是會依照當時情況衡量,目前我有一資料表約有100個欄位(總筆數超過1千3百萬以上),
table layout和資料大致如下
資料
一開始我本想使用ID,Value的設計來處理這些資料,如下
假設今天需求要呈現屬性1、2、3、4、8、9、10相關資料
資料表1一次I/O肯定比較少
--查詢ID 1,5,7 pro1,pro2,pro3,pro4,pro8,pro9,pro10
資料表2I/O肯定高,且TSQL攏長(當然也可以透過[SQL SERVER][TSQL]動態 Pivot來簡化TSQL)
(擷取部分)
結論:
很多事情沒有絕對好或絕對壞(我當然希望每件事情都能兩全其美面面俱到),
雖然我個人很不愛寬資料表設計,
早期主要是因為記憶體不便宜(寬資料表需要更多記憶體),但現在記憶體價格便宜,
而且現實世界中還有效能、專案時程和轉資料順暢度...等因素,我依然選擇我不愛的寬資料表設計,
只不過我還是有稍微分類一下,把原本一個大資料表拆成9個小資料表,
或許你會說,如以後要加屬性不就只能新增資料表欄位,
資料表2設計只需新增資料就好了,
而這就是我一開始提到很多事情沒有兩全其美,凡事總是需要思考衡量後取得一個平衡。
參考