公司组织oracle培训的理解

oracle执行机制

1.客户端发送一条sql给oracle服务器,oracle会看这条sql的执行计划是否存在缓存  如果存在则直接运行,如果不存在执行第二步。

2.如果不存在缓存 则会 进行语法检查(比如我们的sql如果写错了 会报错 就是语法检查这一步做的操作)。然后执行下面的操作(大概是如果你语法没问题。oracle会对你的sql进行优化,并生成执行计划)

3.上面生成的执行计划会保存在缓存中(是为了减少 第二次执行同样的sql时候 再执行硬解析,消耗时间)。

4.oracle最终通过sql执行查询。会在oracle缓存中进行查询如果没有就在oracle硬盘中读取(我们知道oracle数据都是存在硬盘中的,但是每次访问硬盘大量的io操作肯定不可取,所以会读取在缓存中进行查询 缓存中没有 然后再硬盘中读取出来保存在缓存中)。

通过上面 需要注意的 sql语句大小写规范要一致。不然比如第一条sql select * from user  执行了硬解析并保存到了缓存  第二条sql SELECT * FROM USER   会在缓存中查不到 会重新进行硬解析

ps:以前看过sqlserver的执行流程 其实大概也是这样的

避免全表扫描提示查询效率

1、对于null值的查询会进行全表扫描的。所以我们在设计数据的时候对于可能出现null值的字段定义一个默认值 比如"-1" 或者一个‘’  那么当你要查询学生名为空的所有学生的时候:select * from table t.student.Name =‘-1‘

2、避免隐式转换 比如你在设计数据库的时候 UserId 设置的类型为number   你在客户端进查询的时候select * from user u where u.userid=‘1‘ 这种时候数据库和客户端传递的类型不一致 导致索引失效

3、避免查询条件使用函数 select * from user u where u.createTime=to_date(2017-01-02,‘yyyy-mm-dd‘) 这样也会导致索引失效 全表扫描

4、用exists 替换 in 因为in也会导致索引失效 比如查询班级为一年级的学生 select * from student where s.calssid in(select  classid from class  where calssName=‘一年级‘)

替换成 select * from student s where exists(select classid from class where className=‘一年级‘ and s.classsid=s.classid)

当然这个举例有点极端

5、用union all 替换or

比如你需要查询年龄为13 岁 或者 15岁 或者17岁的所有学生信息

select * from student s where s.age in(13,15,17) 、

替换成

select * from student s where s.age=13

union all

select * from student s where s.age=15

unoin all

select * from student s where s.age=17

6.模糊查询 ‘%条件%‘  是全部扫描的 如果业务支持可以改成 ‘条件%‘ 是走索引的

7.join表不能超过3张(表与表之间的关联字段都建立索引) 如果业务支持 可以将数据查询到程序 程序再去取关联数据

List<Student> students=dbhelper.query(select * from student where rownum<=10);

student.ForEach(function(c){

c.studentName=dbhelper.query(select * from class where classid=‘"+c.classId+‘).className

})

ps:这里可能会觉得增加了数据库的负荷。因为取关联数据会给数据库发起10次请求  (其实这10次请求是非常快的 第一是数据库连接池   第二是 上面sql执行机制是直接运行的不会执行硬解析 因为这10条sql是一致的)

8、避免使用select *    *会导致oracle解析这个*表里面含有哪些列 而不是直接取。 * 会导致数据传输量 最好需要什么拿什么

总结:上面的优化操作 可能数据量小的时候感觉不到什么 但是上千万数据的时候 往往不规避以上的上的sql会查询很久  而规避了的sql只需要零点几秒

时间: 2024-08-29 19:29:46

公司组织oracle培训的理解的相关文章

5.oracle的dump理解五 数据块理论

5.oracle的dump理解五 数据块理论 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51228514 前两篇描述了我们在操作层面看到的一些东西,但是没有理论指导,看到越多我们只会越迷糊.所以,蛤蟆从官方文档上摘取一些老少皆宜的内容来补脑. 块是数据块IO的最小单位. 1     数据块和操作系统块 从物理层面,数据库的块存储时候是由操作系统块组成.操作系统块是操作系统可以读写的最小数据单位.ORACLE块是一个逻辑存

oracle数据库基本理解

一.概念 1. 数据库 (Database) 什么是数据库? 数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合. 这种数据集合具有如下特点: 尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序, 对数据的增.删.改和检索由统一软件进行管理和控制. 从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的. 什么是数据库系统? 数据库系统是一个实际可运行的存储.维护和应用系统提供数据的软件系统,是存储介质.处理对象和管理系统的集合体.

joeYGuo(尖刀论坛Oracle培训郭老师) 是一个低素质人渣(截图为证)

今天在尖刀培训论坛的莫名被一个叫 郭老师的(论坛ID JOEYGUO) 低素质人 骂了 有聊天截图为证据,大家以后不要相信此人,不要报此傻波伊的Oracle培训了 此等低素质的人当老师的真的会误人子弟,先声明 我骂他是因为他先骂我的若一个老师 没有为人师表的样子 随口骂人,大家从聊天截图开始就看出来 脏口不断 后来我是实在是忍受不了 就问此人是否被盗号了 他就开骂了 然后我就开始反击了我不是谦谦君子,人不犯我 我不犯人 ,但是你把我惹毛了,我会搞你不惜一切代价,我不会掩盖我在聊天记录里的骂人事实

2012年公司组织旅游西安线个人记录(repost)

2012年公司组织旅游西安线个人记录 目录 [隐藏] 1 序言 2 第1天 3 第2天 4 第3天 5 第4天 6 第5天 [编辑]序言 旅游实在太过无聊,5年前第1次去成都,那时还是全体组织去,认识的人比较多,现在人多了,分组安排,多了许多年轻的面孔,所谓:年年岁岁花相似,岁岁年年人不同. 我的记忆似乎越来越不好使,越来越多的人慢慢淡忘了,以前是随缘记忆,随意遗忘,现在我想写下一点东西,然后全部遗忘. 请原谅我的唠叨,我希望你找到一点共鸣. [编辑]第1天 早上5:30出发,打车去公司,从珠江

公司 邮件 翻译 培训 长难句 结课

今天结课啦...... 明天培训总结,讲翻译技巧总结. 1new forms of thoughts as well as new subjects for thought must arise in the future as they have in the past, giving rise to new standards of elegance. 2if the small hot spots look as expected, that will be a triumph for y

公司 邮件 翻译 培训 6 长难句

1 it therefore becomes more and more important that, if students are not to waste their opportunities, there willhave to be much more detailed information about courses and more advice. 2 experts are debating whether we should burden young children w

oracle schema彻底理解

oracle中的Schema简析 在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同的schema之中,同时,每一个schema对应一个用户,不同的应用可以以不同的用户连接数据库,这样,一个大数据库就可以根据应用把其表分开来管理. 不同的schema之间它们没有直接的关系,不同的shcema之间的表可以同名,也可以互相引用(但必须有权限),在没有操作别的schema的操作根权下,每个用户只能操作它自己的schema下的所有的表.不同的schema下的同名的表,可以存入不同的数据(

Oracle里schema理解

在Oracle中,一个用户就是一个Schema,表都是建立在Schema中的,也可以理解为每个用户拥有不同的表.一个用户想访问另外一个用户,也就是另外一个schema的表的时候,可以用 username.tablename的形式来访问,完全不需要分布式事务.分布式事务不是给你做这个用的. Oracle数据库中不能新创建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决. Oracle中虽然有create schema语句,但是它并不是用来创建一个schema的,具体见下面

Oracle中rownum理解及和rowid的区别

rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每行的rounum不是固定的.而rowid是“物理”编号.若数据库文件没有移动,则每行的 rowid一般是固定不变的. oracle中rownum用法的总结 对于 Oracle的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=),并非说用>,>=,=,between..and时会提示SQL语法错误,而是经常是查不出一条