day08小记

library cache

sql 执行过程

1、检查语法(检查语法,如果有错误,直接返回,省着往下执行浪费资源)  seclt *  form nimei;

2、检查语义(有没有这个表、当前用户有没有操作权限,如果没有直接返回)

3、hash计算(把当前的sql语句转换成oracle可以理解的hash值)

4、解析

4.1软解析(当一条sq1语句执行过,就会保存在library cache中,当再一次执行与此条sql相同的语句时,不经过cpu计算,直接调用share pool)

select * from aa ====>编译成一个XXXX的指令集

select * from aa

4.2硬解析(当软解析不成功进,经过cpu计算)

5、执行

select name from aa where id=1(先计算条件,再对比表,减少查找范围,触发索引就是先看where)

生产中share pool的命中率,应达到90%以上,这样cpu的压力就小了

触发条件:

1、标准化,书写规范(越大的公司标准化做得越好,因为人比较多,如果没有标准约束,不好干活了)

select name from emp;  select name from EMP;

举例:一个大项目,肯定由多个人来完成

2、使用绑定变量

select 价格 from emp where name=1;

select 价格 from emp where name=2;

举例:互联网中,使用人比较多,每个人执行的操作不同,SQL条件也不同。

select 价格 from emp where name=:a;【绑定变量,执行SQL前给绑定变量name先赋值=1,然后再执行】

select 价格 from emp where name=:a;【绑定变量,执行SQL前给绑定变量name先赋值=2,然后再执行】

data dictionary cache

在执行sql语句时,在底层会调用 很多“数据字典”,所以设计了data dictionary cache

select * from all_users;

Optimizer收集器:

CBO优化器:衡量SQL执行计划的,选择一种最优的执行方式

例:

select name from emp where id=1;

1、全表扫描emp (cost 1000)

2、索引rowid扫描emp (cost 10)

不同的执行方式,cost的开销也是不同的,cost是通过收集器计算出来的。【周一 ~ 周五晚上,周六周日全天运行收集器】

收集器收集的是一些计算cost的条件:表有多少行?多少列?数据分布的情况?块情况?等这些值,

然后才能在不执行SQL语句的情况,才能判断SQL不同的执行情况的cost。

假设:emp表有10W行

收集器收集后,全表扫描emp表的cost的开销1000

收集器收集后,索引rowid扫描emp表的cost的开销10

CBO是做决策的吧,收集器是收集信息的吧。

举例:古代打仗(CBO:将军 Optimizer:间谍)

周一 ~ 周五晚上(每次收集全库对象,只有晚上业务空闲一些)周六周日全天运行收集器

如果白天收集,你变一行数据,收集内容就变一下,收集器压力太大了,主要是Oracle数据库的压力大了,所以都在业务低峰收集!减少压力

假设a表晚上只有10行,收集器收集了,早上的时候a表中insert了10W行,白天收集器不收集,这时候就完蛋就有问题了。

CBO判断时依据收集器,收集器收集的结果是a表只有10行。

select name from emp where id=1;

1、全表扫描emp (cost 1)

2、索引rowid扫描emp (cost 2)

所以走了全表扫描,完蛋了,a表有10W行吧,不是10行吧!Oracle不会犯这么大的错误:

操作系统块4K,Oracle块8k,扫描10行数据,全表只要扫描1个块,cost 1。先扫描索引块 cost1,通过索引块的rowid再定位数据块,cost1,一共cost2

10g以前的,优化器是RBO,基于规则的(认为索引扫描就是比全表扫描快)

有1个表是10行,存放在1个表数据块上。

如果先查索引块开销1,再查询表数据块开销1,一共开销2。

如果直接查询表数据块开销1,一共开销1。

10g开始是CBO,基于规则的cost。

假设a表晚上只有10行,收集器收集了,早上的时候a表中insert了10W行,收集器不会收集。但是表产生的变化会写到数据字典中,

如果当前一个对象,它的变化超出阀值(不管阀值是多少,Oracle自己定的)触发收集。

假设a表有100W行,第2天我Insert一条,再delete一条,对于cpu计算的结果没有影响。

假设a表有100W行,第2天我Insert了50W,它的变化超出阀值,就会告诉收集器收集一下。

举例:一个人和平时不太一样

-------------------------------------------

database buffer cache

select name from emp where name=‘zhangsan‘;

【第一次读取,然后存放在Buffer cache,第二次读取,直接从Buffer cache中取】

从内存中读取数据,肯定要比磁盘中读取快。

写操作,先写内存中,速度快,它认为内存中写完,此次操作就完了,当库空闲的时候再把内存的数据写到磁盘中dbf文件

命中率大,减少I/O压力

Buffer cache存储规则:如果用满了,从冷数据中,找与当前时间最远的优先覆盖

------------------------------------------

redo log buffer cache

先写内存中,速度快,它认为内存中写完,此次操作就完了,当库空闲的时候再把内存的数据写到磁盘的redo日志文件中

主流数据库,都是先写日志,再写数据库。日志比较重要,日志健全,数据没了,可以通过日志进行恢复

------------------------------------------

large pool  存储大数据【一次提取大的数据,存储在大池比较好,存储database Buffer cache就不好了,容易造成命中假像】

large pool存放:1、RMAN的备份数据 2、并行操作

------------------------------------------

java pool   调用前端的java指令

这5个池全在SGA(系统全局区域),在内存中分配了SGA区,在SGA又配合了以上5个池,这些池是为了加快访问速度的!!

来自为知笔记(Wiz)

时间: 2024-11-05 03:45:28

day08小记的相关文章

SpringBoot - 二零一七0421小记

一.SpringBoot使用起来比起SpringMVC更便捷,在注解上的小变化,我记录了下面几个: @Controller + @ResponseBody = SpringMVC中用@RestController来代替前面两个注解,通过这个注解,可以将所有的前端http请求放入SpringBoot的Controller容器中,并返回json格式的数据给前端 @RequestMapping(value={"/hello","/hi"},method=RequestMe

广州postgresql用户会技术交流会小记 2015-9-19

广州postgresql用户会技术交流会小记  2015-9-19 今天去了广州postgresql用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用postgresql -X2的情况 第二个讲师介绍了postgresql里面的一些执行计划分析 我个人比较关注第一个session,因为涉及到真正的应用案例 网上有对postgresql -X2的简短介绍,我先转载过来 转载:http://francs3.blog.163.com/blog/static/405767272

git 学习小记之记住https方式推送密码

昨天刚刚学了点git基础操作,但是不幸的是[email protected]给出公告说尽量使用 https 进行操作.可是在用 https 进行 push 时,都需要输入帐号和密码. 各种百度谷歌之后在[email protected]官网找到了解决方法<https方式使用[email protected]设置密码的方式>文中给出了几个方法,并且都非常简单. 关于 cache 缓存方式,我不太喜欢,因为要设置时间,而且会过期.而 store 相应的非常方便,设置全局后,方便多个库使用.当然如果

关于自动化部署之docker容器的折腾小记

docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App(叫Payload)装在Container内,通过Linux Container技术的包装将App变成一种标准化的.可移植的.自管理的组件,这种组件可以在你的latop上开发.调试.运行,最终非常方便和一致地运行在production环境下. 具体什么是docker,你们自己找资料吧,应该好理解.   可以说是个运维的利器,可以把

安卓环境搭建小记

安装容易出现问题:1.更新sdk时可能无法连接服务器,可在C:\WINDOWS\system32\drivers\etc下的hosts文件最后添加:#Google主页203.208.46.146 www.google.com#这行是为了方便打开Android开发官网 现在好像不翻墙也可以打开74.125.113.121 developer.android.com#更新的内容从以下地址下载203.208.46.146 dl.google.com203.208.46.146 dl-ssl.googl

与webView进行交互,webView小记

本文转载至 http://www.verydemo.com/demo_c101_i46895.html 一.与webView进行交互,调用web页面中的需要传参的函数时,参数需要带单引号,或者双引号(双引号需要进行转义在转义字符前加\),在传递json字符串时不需要加单引号或双引号. 1 -(void)webViewDidFinishLoad:(UIWebView *)webView 2 { 3     NSString *sendJsStr=[NSString stringWithFormat

linux学习小记 (一 )

shell 学习小记: 注意:多看系统脚本  多模仿    su切换用户时需要输入目标用户密码,root(superuser)切换到任何用户都不需要输入密码,- 参数必须要是最后一个(su huhu -) sudo需要输入当前用户密码,拥有sudo特权的用户可以执行 "sudo su -"命令,使用自己的密码切换到root用户 , 所以应该在/etc/sudoers 文件中禁止 sudo 执行su命令 linux文件与颜色: /etc/DIR_COLORS   (命令dircolors

自由职业小记6

说说最近的情况 前段时间的小记里面有说到,我接了一个很糟糕的活.客户对技术没有任何了解,需求不明确,还总是改需求.原本3天就完成的工作,被断断续续的托了2个礼拜.至今最后的尾款也还没有打给我,目前已经打给我的金额大概是70%.在前面的几篇小记当中,我一直在说,目前我们这个阶段一定不能挑食,要尽可能的为顾客服务.虽然这段时间我也的确是这么做的,在我理解的工作范围内,继续给予这个客户技术支持.但是在态度上我基本上已经放弃了这个客户了.虽然说不挑食是我们目前来说的需要保持的一个态度,但是这样的客户的确

python开发学习-day08(socket高级、socketserver、进程、线程)

s12-20160305-day08 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin