之前開發一套車輛管理系統,車籍資料超過80個欄位了,資深的長官指示車籍資料分成會異動的一個表格,不會變動的另外一個表格,當時剛到公司的被稱為小朋友,長官說甚麼,就只好幹甚麼,這卻是災難的開始。
資料庫管理系統,課程主要精神就是在教EDR與正規化,正規化很重要,一個系統的效能在於適當地切割資料表,沒有正規化的資料庫,很容易發生資料不匹配的問題,而導致於coding時事倍工半。修課當時,也只是照著課本做,其實對於如何合適地使用SQL語法,是上班之後的事了,不過我覺得對於語法效能最有幫助的課反而是Data Structure,order by就不用說了,排序最少是O(N*logN)當我下了一個group by或者union,腦袋瓜要馬上閃過,這樣子在實際上執行時,花費的時間複雜度是否可以接受。另外,偶而會幫忙同事turning語法,新手最容易犯的錯誤,就是查詢網頁時,資料看不到,原因就在於inner join與left join的不同。
再來是索引的運作,大部分的所以都是使用B-Tree結構來節省查詢的時間,樹狀結構可以把線性搜詢所需要的O(n)時間,reduce到O(logN),如果資料結構B-Tree的那個章節有認真學的話,使用B-Tree的好壞處很快就可以理解,自然也知道最適合加入索引的時間。
之前開發一套車輛管理系統,車籍資料超過80個欄位了,資深的長官指示車籍資料分成會異動的一個表格,不會變動的另外一個表格,當時剛出社會時,被年長20歲的前輩,稱為小朋友,長官說甚麼,就只好幹甚麼,這卻是災難的開始。這樣設計的下場是甚麼呢,就是超級慢的查詢速度,車籍資料有4000筆,兩個表格進行join後,產生4000*4000這麼大的笛卡耳積,先不論資料庫系統進行的什麼優化,或者有設定索引,光就時間複雜度的觀點,就慢了4000倍,這80欄的車籍資料,在大部分的頁面,都需要讀取兩個表格,後來跟我同組的同事討論後,決定合併這兩個表格,結果速度就馬上有明顯的提升,因為長官這一個決策錯誤,全部的code翻起來review一次。
不知道CS哪一門課,教把會變動的資料與不會變動的資料,分開來存放的,是!有的,剛好我們大學開了一門很冷門的課課,叫做檔案結構,不是資料結構喔,這樣存放的確可以減少讀取到記憶體的資料量,但是我們系統的最終儲存目的地是資料庫,而不是自己維護的檔案,所以長官應該是沒有修過資料庫管理系統,甚至於資料結構,經後來他的談話之後,還真的耶,他的開發經驗就是C語言加檔案結構,後來他就沒有再插手系統設計的部分了,只安排了我們做什麼工作,什麼時候交出來而已。
沒有留言:
張貼留言