zoukankan      html  css  js  c++  java
  • CMU Database Systems

    正常应用和数据库交互的过程是这样的,

    其实我们也可以把部分应用逻辑放到DB端去执行,来提升效率

    User-defined Function

    Stored Procedures

    Triggers

    Change Notification

    User-defined Types

    Views

    UDF

    用户定义的function,往往用于select中,不会修改数据本身

    UDF可以用SQL实现,也可以用外部语言,右边是PG的例子

    Stored Procedure

    存储过程,可以理解成在数据库上执行一个脚本

    不但可以读还可以操作修改库

    存储过程的执行往往直接在命令行执行

    Trigger

    触发器,按条件去触发逻辑

    3个要素,事件类型,事件的范围,什么时候触发

    例子,当foo表被改动的时候,往foo audit表里面插入一条audit记录

    首先要定义UDF,log_foo_updates

    然后定义trigger,foo_updates,时间是在更新前,before update,范围是每一行,for each row

    Change Notification

    trigger是在数据库内部的操作,如果要把消息通知到外部用户,就需要change Notification

    User-Defined Type

    一般如果要在数据库里面存储复杂类型,有两种方式

    是否有更为优雅的方式?

    UDT,了解一下

    View

    View是虚拟的,其实是一种sql改写,你对view写的sql最终会被改写成对原表的查询sql

    所以View不会提升查询性能

    最要为了表达方便,比如对一个非常复杂的查询生成一个view,那就不用每次都重复写这个复杂查询

    还有用处,不想让别人直接读原表的所有知道,用view做一个过滤,只让他看到他应该看的

    View由于是虚拟,所以不存在同步问题,原表更新了,view也会一起更新,因为都是重新查的

    这个和Select...Into不同,select into是做snapshot,会把内容真正的写入静态表里面,这样如果原表更新了,snapshot是不会跟着变的

    还有一种view

    物化视图,这个一般只有在商业化数据库中有实现

    物化视图就是做优化,他会materialized部分或全部数据,这样查询view的时候性能就会很好,然后当原表更新的时候,物化视图也要跟着被更新

    物化视图如何实现的,有很多方法,比如用trigger,但是高效的实现是很困难的

  • 相关阅读:
    mac crontab
    mac 修改MAC代码
    python 二叉树计算器
    python 验证码识别
    scp 上传和下载文件
    centos 开机执行的命令
    centos aws 修改使用密码ssh登录
    python nose测试
    C# linq to xml
    Visual Studio 2015+InstallShield 2015
  • 原文地址:https://www.cnblogs.com/fxjwind/p/10950218.html
Copyright © 2011-2022 走看看