视图应用竟然还可以这么优化?不得不收藏(8)
一、视图概述(技术文):
(1)什么是视图?
视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。视图并不在数据库中以存储的数据值集形式存在,而是存在于实际引用的数据库表中,视图的构成可以是单表查询,多表联合查询,分组查询以及计算(表达式)查询等。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
(2)视图的优点:
a、简化查询语句(视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。)
b、可以进行权限控制
把表的权限封闭,但是开放相应的视图权限,视图里只开放部分数据列等。
c、大数据表分表的时候,比如某张表的数据有100万条,那么可以将这张表分成四个视图。
按照对id取余计算
d、用户能以多种角度看待同一数据:
使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。
e、对重构数据库提供了一定程度的逻辑独立性:
视图可以使应用程序和数据库表在一定程度上独立。
(3)视图的缺点:
1)性能差:
把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。
2)修改限制:
当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
(4)视图使用场景(其实就是需要用到视图上面的几个优点的时候):
1) 需要权限控制的时候。
2)如果某个查询结果出现的非常频繁,就是要经常拿这个查询结果来做子查询,使用视图会更加方便。
3)关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作;
(5)视图的分类:
1)关系视图:
它属于数据库对象的一种,也就是最常见的一种关联查询;
2)内嵌视图:
它不属于任何用户,也不是对象,创建方式与普通视图完全不同,不具有可复用性,不能通过数据字典获取数据;
3)对象视图:
它是基于表对象类型的视图,特性是继承、封装等可根据需要构建对象类型封装复杂查询(官方:为了迎合对象类型而重建数据表是不实现的);
4)物化视图:
它主要用于数据库的容灾(备份),实体化的视图可存储和查询,通过DBLink连接在主数据库物化视图中复制,当主库异常备库接管实现容灾;
二、视图的使用(技术文):
1、创建视图
-
create or replace view v_test asselect * fromuser;
加上OR REPLACE表示该语句还能替换已有的视图
2、调取视图
-
select * from v_test;
3、修改视图
-
alter view v_test asselect * from user1;
4、删除视图
-
drop view if exists v_test;
5、查看视图
-
show tables;
视图放在information_schema数据库下的views表里
6、查看视图的定义
show table status from companys like'v_test';
在这之前,我们必须明确!增删改最终都是修改到基础表。且视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。(技术文)
三、视图的算法——存在两种执行的算法
a、Merge:合并的执行方式,每当执行的时候,先将我们的视图的sql语句与外部查询视图的sql语句,混合在一起,最终执行。
b、Temptable:临时表模式,每当查询的时候,将视图所使用的select语句生成一个结果的临时表,再在当当前临时表内进行查询。
四、视图使用注意点(技术文):
(1)修改操作时要非常非常小心,不然不经意间你已经修改了基本表里的多条数据;
(2)视图中的查询语句性能要调到最优;
(3)虽说上面讲到,视图有些是可以修改的。但是更多的是禁止修改视图。
对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系或者特殊的没有约束的一对多字段。还有一些特定的其他结构,这类结构会使得视图不可更新。
不可更改的情况如下:视图中含有以下的都不可被修改了。
(一)聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
(二)DISTINCT。如下错误。
(三)GROUP BY
(四)HAVING
(五)UNION或UNION ALL
(六)位于选择列表中的子查询
(八)FROM子句中的不可更新视图
(九)WHERE子句中的子查询,引用FROM子句中的表。
(十)ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。
相关文章
- 【华为云技术分享】A-Tune:基于AI的自优化能力,让应用发挥极致性能
- Jedis应用
- 在Docker中运行Dubbo应用
- K8S java应用jvm内存诊断解决方案:java应用诊断和在线debug利器bistoury介绍及在K8S环境中的使用
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
- 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈
- Web 应用服务器端渲染入门指南
- 读取SAP CRM One Order应用日志的优化方式
- smart filter无法从smart business应用获得值的问题分析
- 如何提取SAP UI5应用的技术信息
- Angular 应用里的摇树优化 - tree shaking
- DL之DNN优化技术:利用Dropout(简介、使用、应用)优化方法提高DNN模型的性能
- 【优化算法】回溯搜索优化算法及其应用(BSA)(Matlab代码实现)
- 二元灰狼优化(BGWO)应用于特征选择任务(Matlab代码实现)
- 基于狮群优化的BP神经网络(分类应用) - 附代码
- 基于遗传算法优化的BP神经网络(预测应用) - 附代码
- 基于蝗虫优化的BP神经网络(预测应用) - 附代码
- 基于鸟群优化的BP神经网络(预测应用) - 附代码
- 基于灰狼优化的BP神经网络(预测应用) - 附代码
- 智能优化算法应用:基于麻雀搜索算法的工程优化案例
- 基于麻雀优化的BP神经网络(分类应用) - 附代码
- 【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )
- 【Android 电量优化】电量优化特性 ( Doze 低电耗模式 | Standby 应用待机模式 | 白名单设置 | 白名单添加系统设置界面 | 指定应用的白名单添加界面 | 测试应用 )
- 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | ActivityThread 主函数分析 | 应用初始化 | 启动优化项目 )
- 报表应用结构优化之数据分库存储
- 在高德地图应用api,和api展出的标记小的应用程序
- 【目标检测】Flask+Docker在服务器部署YOLOv5应用