• 关于视图的思考:对服务器性能不一定好


    问题:

    有两个表如下:
    表A:语文表
      id:学号(主键)
      yuwen:成绩

    表B:数学表
      id:学号(主键)
      shuxue:成绩


    如果我要查一个人的语文和数学成绩,有两种方法:

    一:分两次查,每次根据id来,有索引;
      select yuwen from A where id=123;
      select shuxue from B where id=123;

    二:建一个视图,联表查询,有id、yuwen、shuxue三个字段,
      select yuwen,shuxue from A,B where A.id = B.id and A.id=123;

    如果数据量很大, 那么哪个效率高啊?

    分析

    这个问题关键是看:联表查询的视图,有索引吗?
    说法一:where A.id = B.id 是没有索引的,但是where A.id = B.id and A.id=123 是有索引的。如果是这样的话,不但用到了索引,而且减少了查询次数,那么效率肯定是高的
    说法二:联表查询没有用到索引,会导致一张表进行全表扫描,所以效率会低

    怎么觉得都有道理呢。。。。

    再来看网上的一个说法,视图的优缺点

    优点:
      简单性
      安全性
      逻辑数据独立性

    缺点:
      性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
      修改限制

    老大说:

      涉及到具体数据库如何生成执行计划了
      视图当然是有代价的,代价往往就是性能和可维护性嘛
      数据库本身又不能有什么缓存机制
      视图肯定不是为性能设计的

    所以我觉得:视图从来就没有性能上的优点,它只是方便而已

     在代码模型层中建视图好还是在数据库中建视图好?

      比较一下就知道了
      在model层做视图开发人员可以直观的了解视图,并可以根据需求随时修改
      在数据库做视图则简化了业务逻辑,但是视图的维护需要花费额外的人力
      其实就像是model有afterSave beforeSave之类的钩子,数据库也有触发器,哪个好?差不多,前者一样是透明,好维护,后者则简化逻辑,同时效率更高。
      此外要考虑你使用的数据库,oracle,sqlserver等数据库的视图数据是缓存的,从视图查询比使用表连接查询要快的多,但是mysql的视图数据是非缓存的,并没有性能的提升。

    参考链接:

    [1].https://blog.csdn.net/onebigday/article/details/50541787
    [2].https://www.cnblogs.com/liuguanghai/p/5460913.html
    [3].https://segmentfault.com/q/1010000004613776

  • 相关阅读:
    回溯算法之素数环
    回溯算法之迷宫问题
    回溯算法之0-1背包问题
    贪心算法之搬桌子问题
    贪心算法之背包问题
    动态规划之收集苹果
    动态算法
    c#数和二叉树
    c# 排序算法
    c#栈的习题2
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/sqlView.html
Copyright © 2020-2023  润新知