昨天代碼提交之后,今天沒什么任務, 我就看下代碼是否有疏漏,有什么問題的地方,看着看着就看到之前寫數據庫對應dto時遇到的問題。
公司數據庫表里發現表A含有表B和表C中相關的幾個字段。按照數據庫設計規范來說,表A中如果出現表B的多個字段,這樣是違反第三范式的,這樣會增加數據庫內存的消耗,尤其是一旦數據量很大,內存影響還是會存在的。
我曾在德國某公司實習的時候,leader告訴我,雖然要遵守數據庫設計規范,但是有些情況下,卻是不得不打破這些范式,比如需要用空間來換時間的時候。
犧牲空間來換時間,這個在做算法的時候經常會用到,只要犧牲空間在合理的范圍下,爭取到大量的時間來平衡,還是算的上不錯的優化的。
說到公司的數據庫某幾張表的設計,就上述提到的那個問題,我去查了一圈,問了一圈,(因為這本是可以用視圖來解決的問題),發現普通的視圖其實跟建立幾張表的連接關系語句去查詢是基本一樣的時間消耗。
后來問到有物化視圖這一存在,oracle本身也是支持物化視圖的,那什么是物化視圖呢?物化視圖的優點和缺點又有什么呢?
MView中文名稱為物化視圖(Materialized View),相對於普通視圖來說,MView的不同之處在於MView的結果會保存在一個普通的數據表中,在對MView進行查詢的時候不再會對創建 MView的基表進行查詢,而是直接查詢MView對應的結果表,然后通過定期的刷新機制來更新MView表中的數據。
這樣一來物化視圖的優點就很直觀了,查詢速度相對於普通視圖就會大大提升。
當然,按照其定義的,數據存儲下來的話,就會和普通表一樣占用很大的存儲空間了。
事物的存在必有其道理。那這樣的話相對於普通表來說,物化視圖又有什么優點呢?
1.物化視圖有視圖的優點,視圖可以簡化用戶的操作,可以隱藏數據表之間的關系(引申出來能夠對機密數據提供安全保護),可以對重構數據庫提供一定的邏輯獨立性等等,具體可參考
http://blog.csdn.net/fm0517/article/details/5625949
2.既然是視圖,那就是一條查詢語句,這樣的話就可以查詢出部分的數據,如select top 1000,這樣就不需要將全部的數據存儲下來,稍微減輕了物化的缺點(此條為為自己考慮到的情況,並未嘗試過)
3.既然是會存儲數據,那也可以用作數據庫復制了
以上是我自己所能理解的,以下為查到的補充:
下面列舉了MView在實際中的主要作用:
- 減輕網絡負擔:通過MV將數據從一個數據庫分發到多個不同的數據庫上,通過對多個數據庫訪問來減輕對單個數據庫的網絡負擔。
- 搭建分發環境:通過從一個中央數據庫將數據分發到多個節點數據庫,達到分發數據的目的。
- 復制數據子集:MV可以進行行級/列級的篩選,這樣可以復制需要的那一部分數據。
- 支持離線計算:MV不需要專用的數據庫連接,用戶可以按照自己的需求來復制所需要的那一部分數據。
MView的刷新:
Oracle支持三種刷新方式,1.完全刷新 2.快速刷新 3.強制刷新
1.完全刷新:將MView的數據全部刪除,再根據創建MView時候的查詢生成數據插入到MView
2.快速刷新:只刷新上次刷新以來修改的數據,很快(需要建立MView Log)
3.強制刷新:當快速刷新無法進行的時候,系統會進行完全刷新,二者結合就是強制刷新
刷新語句:
exec dbms_mview.refresh('mvt', 'F') ; F為fast C為complete,還有一個Force是默認的
刷新MView:
創建job來刷新, 在創建MView的時候指定REFRESH語句 start with:第一次刷新時間,Next:刷新時間間隔
MView的必要組成部分:
1.基表
2.隱藏的MView對象
3.MView表
4.基表的Index
5.MView的Index
對於需要快速刷新的MView:
6.MView Log
7.維護MLog$_的內部觸發器