正常應用和數據庫交互的過程是這樣的,sql
其實咱們也能夠把部分應用邏輯放到DB端去執行,來提高效率數據庫
User-defined Function性能
Stored Procedures優化
Triggers命令行
Change Notification3d
User-defined Typesblog
Views事件
用戶定義的function,每每用於select中,不會修改數據自己同步
UDF能夠用SQL實現,也能夠用外部語言,右邊是PG的例子it
存儲過程,能夠理解成在數據庫上執行一個腳本
不但能夠讀還能夠操做修改庫
存儲過程的執行每每直接在命令行執行
觸發器,按條件去觸發邏輯
3個要素,事件類型,事件的範圍,何時觸發
例子,當foo表被改動的時候,往foo audit表裏面插入一條audit記錄
首先要定義UDF,log_foo_updates
而後定義trigger,foo_updates,時間是在更新前,before update,範圍是每一行,for each row
trigger是在數據庫內部的操做,若是要把消息通知到外部用戶,就須要change Notification
通常若是要在數據庫裏面存儲複雜類型,有兩種方式
是否有更爲優雅的方式?
UDT,瞭解一下
View是虛擬的,實際上是一種sql改寫,你對view寫的sql最終會被改寫成對原表的查詢sql
因此View不會提高查詢性能
最要爲了表達方便,好比對一個很是複雜的查詢生成一個view,那就不用每次都重複寫這個複雜查詢
還有用處,不想讓別人直接讀原表的全部知道,用view作一個過濾,只讓他看到他應該看的
View因爲是虛擬,因此不存在同步問題,原表更新了,view也會一塊兒更新,由於都是從新查的
這個和Select...Into不一樣,select into是作snapshot,會把內容真正的寫入靜態表裏面,這樣若是原表更新了,snapshot是不會跟着變的
還有一種view
物化視圖,這個通常只有在商業化數據庫中有實現
物化視圖就是作優化,他會materialized部分或所有數據,這樣查詢view的時候性能就會很好,而後當原表更新的時候,物化視圖也要跟着被更新
物化視圖如何實現的,有不少方法,好比用trigger,可是高效的實現是很困難的