Atitit.code base view 视图的实现原理
Atitit.code base view 视图的实现原理
1. 视图的执行算法:
存在两种执行算法:
1、 Merge:合并的执行方式,每当执行的时候,先将我们视图的sql语句与外部查询视图的sql语句,混合在一起,最终执行;
2、 Temptable:临时表模式,每当查询的时候,将视图所使用的select语句生成一个结果的临时表,再在当前的临时表内进行查询。
指的是一个视图是在什么时候执行,依据哪些方式执行;
对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。
对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新
当用户创建视图时,mysql默认使用一种undefine的处理算法,就是会自动在合并和临时表内进行选择。
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
2. 不可更新的视图:
某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:
· 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
· DISTINCT
· GROUP BY
· HAVING
· UNION或UNION ALL
· 位于选择列表中的子查询
· Join
· FROM子句中的不可更新视图
· WHERE子句中的子查询,引用FROM子句中的表。
· 仅引用文字值(在该情况下,没有要更新的基本表)。
· ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。
3. 关于视图的可插入性:insert
如果视图满足关于视图列的下述额外要求,可更新的视图也是可插入的:
· 不得有重复的视图列名称。
· 视图必须包含没有默认值的基表中的所有列。
· 视图列必须是简单的列引用而不是导出列。导出列不是简单的列引用,而是从表达式导出的。下面给出了一些导出列示例:
· 3.14159
· col1 + 3
· UPPER(col2)
· col3 / col4
· (subquery)
混合了简单列引用和导出列的视图是不可插入的,但是,如果仅更新非导出列,视图是可更新的。
4. 视图定义
wxb_order
#left join tabxxx on order_id=order_id
wxb_order_count,order_id=order_id
5. 调用
public List<String> insertSql(Map m) {
List<String> li = Lists.newArrayList();
if (m.get("$tabletype") != null && m.get("$tabletype").equals("view")) {
String[] tabs = new View(m.get("$table"), m.get("$view_store_path"))
.getTables();
for (String tab : tabs) {
Map m2 = MapX.clone(m);
m2.put("$table", tab);
String s = get_insert_singleTable_sql(m2);
li.add(s);
}
return li;
}
return li;
}
package com.attilax.orm;
import java.util.Map;
import com.attilax.io.filex;
import com.attilax.io.pathx;
import com.attilax.sql.SqlJoinAst;
import com.attilax.sql.SqlJoinParser;
public class View {
private Object obj;
private Object viewStorePath;
public View(String viewName) {
// TODO Auto-generated constructor stub
}
public View(Object objectName) {
this.obj = objectName;
}
public View(Object objectName, Object viewStorePath) {
this.obj = objectName;
this.viewStorePath = viewStorePath;
}
public String[] getTables() {
String f = pathx.classPath() + "/" + this.viewStorePath + "/"
+ obj.toString() + ".txt";
// String t=filex.read(f);
SqlJoinAst ast = new SqlJoinParser().parse(f);
String tabs = ast.table;
for (Map join_tab : ast.joinTables) {
tabs = tabs + "," + join_tab.get("joinTable");
}
return tabs.split(",");
}
}
Atitit.code base view 视图的实现原理的更多相关文章
- Atitit 数据库view视图使用推荐规范与最佳实践与方法
Atitit 数据库view视图使用推荐规范与最佳实践与方法 1. 视图的优点:1 1.1. **提升可读性 定制用户数据,聚焦特定的数据1 1.2. 使用视图,可以简化数据操作. 1 ...
- Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结
Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结 1.1. 五中滤镜的分别效果..1 1.2. 基于肤色的图片分类1 1.3. 性能提升2 1.4. --co ...
- Django base view
class django.views.generic.base.View 它是基类的基类,其它View基类都是从这继承的. 官例: from django.http import HttpRespon ...
- DNS主从服务,子域授权,view视图,日志系统,压力测试
DNS主从服务,子域授权,view视图,日志系统,压力测试 DNS性能测试工具queryperfDNS查询过程: DNS主从建立: 环境: 主服务器:10.140.165.93 从服务器:10.140 ...
- MVC(Model(模型) View(视图) Controller(控制器))
复习 1. 商品表 增删改查 index.php add.php view.php edit.php action.php 2. MVC(Model(模型) Vie ...
- 自定义View视图
自定义View视图文件查找逻辑 之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写 ...
- view视图--display中echo出ob_get_contents的缓冲内容--(实现,拼接好文件--导入文件)
view.php01默认设置有3个公共的属性,其他属性.后面实例化的时候.通过传递参数.foreach遍历,不断的增加属性02view对象的实例化.位置在-->控制器父类的构造方法中视图的目录名 ...
- SpringMVC源码情操陶冶-View视图渲染
本节简单分析View视图对象的render方法 View接口 最重要的就是render()方法,具体源码如下 /** * Render the view given the specified mod ...
- Android View视图系统分析和Scroller和OverScroller分析
Android View视图系统分析和Scroller和OverScroller分析 View 视图分析 首先,我们知道.在Android中全部的视图资源(无论是Layout还是V ...
随机推荐
- shell 查看 具体某行的值
sed: sed '5!d' file awk: awk 'NR==5' file
- 通用数据库管理工具DBeaver
通用数据库管理工具DBeaver 在渗透测试中,用户往往需要管理很多数据库.这些数据库可能是渗透软件使用的(如Metasploit使用的Postgresql),也有目标主机的数据库(如网站的数据库 ...
- [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1023 Solved: 436[Submit][Status ...
- [BZOJ 3170] 松鼠聚会
Link: BZOJ 3170 传送门 Solution: $Knowledge Point:$ 切比雪夫距离$DIST(a,b)=max\{ |X'_a-X'_b|,|Y'_a-Y'_b|\}$ 曼 ...
- 【AC自动机】【状压dp】hdu2825 Wireless Password
f(i,j,S)表示当前字符串总长度为i,dp到AC自动机第j个结点,单词集合为S时的方案数. 要注意有点卡常数,注意代码里的注释. #include<cstdio> #include&l ...
- 【后缀数组】poj2406 Power Strings
连续重复子串(pku2406)给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的,求 R 的最大值.算法分析:做法比较简单,穷举字符串 S 的长度 k,然后判断是否满足.判断的 ...
- iOS开发——NSIBPrototypingLayoutConstraint原型约束造成的莫名问题
问题描述: 使用Autolayout 从xib加载后代码添加Constraint,xib中没有任何约束,只是创建了n个View并拖了线方便调用 在运行过程中产生约束冲突错误, NSIBProtot ...
- Java杂谈4——Java中的字符串存储
Java中的String Java.Lang.String是Java语言自带的字符串实现,它并不是java的基本类型,但却和几乎每个java程序都密切相关的一个基础java类. string类内部实际 ...
- How to enable Hibernate option in windows 2008 R2 server?
http://velshare.blogspot.com/2013/02/how-to-enable-hibernate-option-in.html 1) To enable the Hiberna ...
- C#中yield return用法
转载:http://www.jb51.net/article/54810.htm http://www.cnblogs.com/HunterWei/archive/2012/06/13/csharpy ...