zoukankan      html  css  js  c++  java
  • mysql视图和临时表的区别

    视图

    视图是由从数据库的基本表中选出来的数据组成的逻辑窗口,它与基本表不同的是,视图是一个虚表。数据库中只存放视图的定义,而不存放视图包含的数据,这些数据仍存放在原来的基表中。所以基表中的数据如果发生改变,从视图中查询出的数据也随之改变。

    视图是一个虚表,他是通过执行SQL查询所产生的。视图以select命名存储于数据字典当中。每当SQL查询包含有视图名称的时候,数据库管理系统会执行在视图定义当中所包含的查询,以建立其虚拟结果表。该结果表可以当做查询其余部分的源表使用。

    视图可以是建立在一个或多个表上,也可以建立在视图上,但是不管怎么样对视图数据的操作最终都会转换为对基本表的操作,因为视图是一个虚表,数据实际上保存在基本表中

    临时表

    临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 

     临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

    临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作,在VFP退出时自动被释放。

    临时表是一种并不存储在数据库当中的基表。与之相反的是,临时表只存在于创建该临时表的数据库会话被激活的情况下。

    临时表存储在数据库会话中,不在数据库中,当使用show tables 时没有显示,但是可以查询,当关闭数据库(quit,exit)然后在打开在去数据库中查询的时候就不存在了。

    视图和临时表的区别

    1、视图只存在于单个查询当中,每次使用该视图名,其虚拟表就会根据现有的数据重新被创建。 2、临时表存在于它被创建的整个数据库会话过程中。 3、视图自动使用其所定义的查询检索出来的数据进行填充。 4、必须使用SQLINSERT命令来向临时表添加数据。 5、只有那些符合视图可更新能力标准的视图才可用于数据修改。当使用视图进行更新时,该更新会永久被传递至底层基表上。 6、由于临时表都是基表,因此所有的临时表都是可更新的。不过,这些更新对于这些表来说是临时性的。 7、由于视图的内容是在该视图每次被使用的时候才生成,因此视图当中的数据几乎每次都是最新的。 8、临时表当中的数据所反应的是数据库在该表被装载进数据库时的状态。如果临时表所装载的源表中的数据在临时表检索这些数据之后发生了改变,那么临时表当中的内容有可能与数据库当中的其他部分的数据脱离同步状态。

    优缺点

    1、由于视图的内容是在该视图每次被使用的时候才生成,所以数据和数据库中的数据是同步的,但是在每次查询的时候都要建立视图表结构,所以比较浪费时间。 2、临时表仅需创建一次,所以相比视图每次都创建视图结构,节省了大量时间,但是临时表的数据在数据源发生改变是没有进行更新的话,就会出现数据不同步现象。 3、简化数据查询语句——定义视图可以将表与表之间的复杂的连接操作和搜索条件对用户影藏起来,用户只需简单的对一个视图进行查询即可。 4、使用户能从多角度看待同一数据。 5、提高了数据的安全性———在建立视图的时候可以吧敏感的数据影藏起来,而吧需要的数据暴露给客户这样的话比较安全。 6、提供了一定程度的逻辑独立性——数据库中是三级模式两级映射,三级模式是 外模式、模式、内模式而这里的视图就是外模式,这样就提供了数据的逻辑独立性。

    什么时候使用视图呢?

    应用场景1:保密工作,比如有一个员工工资表,如果你只希望财务看到员工工资这个字段,而其他人不能看到工资字段,那就用一个视图,把工资这个敏感字段过滤掉

    应用场景2:有一个查询语句非常复杂,大概有100行这么多,有时还想把这个巨大无比的select语句和其他表关联起来得到结果,写太多很麻烦,可以用一个视图来代替这100行的select语句,充当一个变量角色

    什么时候用临时表呢?

    应用场景1:你在短期内有很多DML操作,比如京东淘宝亚马逊的购物车表,把东西放购物车(insert),变更数量(update),删除商品(delete),一旦结算金钱后,这些数据就要清掉,这时需要用临时表

    应用场景2:在导出数据时,你可能不想导完整的数据库,或者表,你可能只想要导出符合某些条件的数据,那么你可以创建临时表,把select语句插入到临时表,接着导出这个临时表,导完以后通过结束session或者事务的方式,让这些没用的数据自动清理掉

    应用场景3:你在写存储过程时,有很多的连接,比如你需要连接A,B,C,D,E,F,G,H那么多张表,才能得到你的结果表,同时做连接的消耗太大,你可以先A,B,C连接的结果,放在临时表,接着再把这张临时表,跟D,E,F连接,作为新的结果放在临时表,接着再把临时表与G,H连接,最后得到临时表数据,一次插入到结果表(永久表)。

    二者区别:

    空间分配:物理空间的分配不一样,视图不分配空间,   临时表会分配空间

    虚实:视图是一条预编译的SQL语句,并不保存实际数据,而临时表是保存在tempdb中的实际的表。即视图是一个快照,是一个虚表,而临时表是客观存在的表类型对象。它们的结构一个是表、一个快照。可以把视图想象成联合表的快捷方式。

    mysql视图和临时表的区别

  • 相关阅读:
    [Panzura] identify user operations(copy, open, read ... ) in audit log
    Spark 学习
    Zeppelin 学习
    Delta Lake 学习
    传染病模型 SI
    xcodebuild和xcrun实现自动打包iOS应用程序
    控制UIlabel 垂直方向对齐方式的 方法
    ALAssetsLibrary
    CATransform3D
    AVFoundation的使用
  • 原文地址:https://www.cnblogs.com/lixuwu/p/10730747.html
Copyright © 2011-2022 走看看