记住:二八法则sql
百分之八十的功能只用到了百分之二十的知识点。而人的时间精力是宝贵的,但愿你们均可以有目标有反馈有做用的学习,让学习落地。数据库
数据库体系结构以下(很是重要):缓存
举例一个普通查询执行顺序:session
(select object_name from t where object_id = 29;)分布式
用户发起请求 ---------> PGA保存用户链接和权限信息(只要不断开session,下次直接从PGA中读取),并比配一条惟一HASH值(身份证) --------> SGA共享池查看是否有HASH值,若是没有即检查语法和语义是否正确,是否有权限,没问题就存储这个HASH值。 ------> 解析语句(如:在object_id有索引的状况下估算用索引查仍是全表扫描代价(COST)低用哪一个)并存储执行计划(与惟一HASH值对应在一块儿) --------> 进入内数据缓存区查找如找不到进入数据库文件查找并将值返回学习
测试脚本:测试
drop table t; create table t as select * from all_object; create index idx_object_id on t(object_id); set autotrace on set linesize 1000 set timing on select object_name from t where object_id = 29;
set autotrace on 开启跟踪sql的执行计划和执行统计信息spa
set timing on 跟踪语句执行完成时间。线程
执行结果:日志
第一次
第二次
所花费的时间减小了
花费资源也少了
由于第二次不须要保存用户链接信息和权限信息,也不须要估算执行方法,并且数据已经缓存到数据缓存区,花费更低了。
举例一个普通更新执行顺序:
(update t set object_id = 92 where object_id = 29;)
查找数据流程和SELECT语句同样,不一样的是以后的流程。
当数据在数据缓存区中被修改以后系统会调用DBWR进程将数据写入到DB数据文件中。
Oracle 日志系统:
Oracle日志系统记录了用户的操做信息:
A操做:建表 B操做:插入数据 C操做:更新数据
若是误更新或误删除数据,只须要执行B C操做,若是误删表,只需执行A B C操做
进程LGWR就是将日志缓存区中数据写入到数据库的日志文件中
由于日志文件数量有限,当记录满了以后,ARCH进程会将一部分日志文件备份并清空再次使用。
Oracle的COMMIT 与 ROLLBACK
Oracle中的数据是在数据缓存区中修改的,但不是确认COMMIT以后当即写入数据库中(还在缓存区),而是记录修改日志。当修改记录达到必定量级再一次性刷入数据文件中。如何防止断电内存数据消失呢?记录日志是事实存入磁盘的,因此断电以后会自动读取日志文件恢复数据。
而控制数据什么时候从数据缓存区存入数据库是CKPT进程决定的,可是,当LGWR进程出现问题时,DBWR进程不会遵从CKPT命令将数据写入磁盘,而是等待LGWR完成。
即先有记录后有执行。
更新时,查询到相应数据到数据缓存区后,会在回滚表空间相应回滚事务表上分配事物槽,从而在回滚表空间分配到空间,该动做须要记录日志到日志缓存区;
在数据缓存区中建立未更改数据的镜像,这个镜像数据也会写入磁盘的数据文件里(回滚表空间的数据文件),也会记录日志。
以后才容许修改数据,并记录日志;
若是执行了COMMIT,日志缓存区当即记录这个提交信息,而后将回滚段事物标记为INACTIVE状态,表示容许重写;
若是执行了ROLLBACK,将回滚段的修改前镜像读取出来,修改入缓存区完成回滚。会记录日志。
DML语句特色:
因为其会改变数据库的数据。会产生未来用于恢复数据的redo和用于回退的undo。因为undo也须要保护,会有专门的保护undo的redo。
Oracle的进程介绍(核心的几个):
PMON进程(Processes Monitor):进程监视器。
若是执行更新未提交时进程崩溃了,PMON会自动回滚该操做;
若是RECO异常失败了,PMON会重启RECO进程;
若是LGWR进程失败,PMON甚至会终止这个实例等等。。。。
SMON进程(System Monitor):系统监视器。与PMON监视单个进程不一样,它的工做在于 intance recovery,此外还有清理临时表空间、清理回滚段表空间、合并 空闲空间等等。。。。
LCKn进程:仅使用RAC数据库,最多10个进程(LCK0-LCK9),用于实例间的封锁。
RECO进程(Distributed Database Recovery):用于分布式数据库的恢复,适用于两阶段式提交场景。如:多个数据库A、B、C,某应用跨三个数据库,三个数据 库都提交成功才成功,否者都失败的状况。
CKPT进程:由Oracle的 FAST_START_MTTR_TARGET参数控制,用于触发DBWR进程。
DBWR进程:Oracle最核心进程之一,负责将数据从数据缓存区写入到磁盘。由CKPT进程触发,执行前会强制通知LGWR进程将日志数据写入日志文件中。
LGWR进程:Oracle最核心进程之一,将日志数据写入日志文件中。为了保证操做日志的顺序,LGWR进程是单线程的。
每隔三秒钟执行一次;
任何COMMIT触发LGWR执行一次;
DBWR将数据写入磁盘,LGWR运行一次;
日志缓冲区满三分之一或满1MB,执行一次;
联机日志文件切换也将触发LGWR。
ARCH进程:做用是当LGWR写日志,文件满了须要覆盖重写时,触发ARCH进程复制日志文件出去造成归档文件,以避免日志丢失。