正常应用和数据库交互的过程是这样的,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,可是高效的实现是很困难的