数据库Oracle的具体原理

会话(session)

用户登录会产生会话,用户登出会结束会话

内存结构

SGA(System Global Area):由所有服务进程和后台进程共享;
PGA(Program Global Area):由每个服务进程、后台进程专有;每个进程都有一个PGA。

后台进程

  • SMON 是系统监视器(System Monitor)的缩写。如果Oracle实例失败,则在SGA中的任何没有写到磁盘中的数据都会丢失。有许多情况可能引起Oracle实例失败,例如,操作系统的崩溃就会引起Oracle实例的失败。当实例失败之后,如果重新打开该数据库,则背景进程SMON自动执行实例的复原操作。
  • DBWR 是数据库书写器(Database Write)的缩写.该服务器进程在缓冲存储区中记录所有的变化和数据,DBWR把来自数据库的缓冲存储区中的脏数据写到数据文件中,以便确保数据库缓冲存储区中有足够的空闲的缓冲存储区。脏数据就是正在使用但是没有写到数据文件中的数据。
  • LGWR 是日志书写器(Log Write)的缩写。LGWR负责把重做日志缓冲存储区中的数据写入到重做日志文件中。
  • CKPT 进程是检查点(Checkpoint)的缩写。该进程可以用来同步化数据库的文件,它可以把日志中的文件写入到数据库中。
  • PMON 是进程监视器(Process Monitor)的缩写。当取消当前的事务,或释放进程占用的锁以及释放其它资源之后,PMON进程清空那些失败的进程。

管理

  • 水位线
    HWM 就犹如一个水库中的最高水平线, 水库加水时,水位线会上升,放水时,水位线会下降,但曾经水位线的痕迹是无法抹去的,这个痕迹就是所说的最高水位线。为了降低水位线,请使用使用trancate 代替delete,但是前者不可恢复。

实际应用须知

  • 加字段会锁表!可以通过不指定默认值来不锁表。
  • 加索引一定会锁表,生产环境下一般要正在系统非高峰期执行。
  • 注意,笨蛋oracle会认为大小写不同的sql。这也是保持一致的必要性。这样同一条sql oracle只需要解析一次即可。
  • oracle采用自下而上的方式来解析where,所以,把选择性最大的字段放在后面。
  • 禁止使用select *,因为oralce会访问数据字典找到所有字段。
  • UNION会排序和去重,如果没有这个需求,使用UNION ALL而非UNION
  • 尽可能多使用commit
  • count(1)比count(*)快,结果一致,而count(colname)不包含对该列null值的统计。有主键的话最推荐的是count(主键)。当然count(索引键)也行,但是索引键可能为null,所以和count(1)结果可能不同。
  • 避免使用having子句,having语句一定会引发排序
  • 避免使用not in ,使用not exist 和外连接。
  • exist 或者group by代替distinct。
  • 使用UNION ALL代替or,或者使用IN代替OR
  • order by 后的字段最好有索引。如果是唯一性索引最好,省略了所有排序过程。
  • 有程序员喜欢写where 1=1,纯粹是给自己拼接sql省事而已,可能也可能不会降低性能。

索引失效的情况

  • 大于小于都可以走索引,但是不等于不行
  • 索引不存储null值,在索引上进行null值判断将导致全表扫描

设计规范:

  • 超过五千万行要考虑分表。如果字段比较多,一两千万行就要考虑分表。
  • 禁止从测试开发环境直接连生产数据库
  • 禁止使用分区表,因为分区表的DML操作消耗太大
  • 尽量不使用外键
  • 单张索引数量不超过五个
  • 联合索引字段数不超过五个
  • 索引只能建在小字段上
  • 一个频繁进行insert和update的表,就别建索引了
  • 使用索引不得使用函数,如果一定要这样,可以在建索引时使用函数索引。

执行计划

  • 基于成本
    预估IO,内存,CPU消耗。一般来讲瓶颈在IO
  • 基于规则
    已经被淘汰。
  • 基于选择性
    已经被淘汰

唯一索引会进行唯一性扫描。
索引全所描
索引快速全扫描 不排序

Oracle的SCN机制(MVCC)

SCN是一个数字,确切的说是一个只会增加、不会减少的数字。
SCN用以标识数据库在某个确切时刻提交的版本。事务commit时,会获取一个SCN号。
当查询开始时如果发现某个数据块的SCN大于事务开始时的SCN,则查询就忽略该数据块,因为这个数据块实在事务开始后添加的。
如果小于或等于,就要检查系统中是否有未提交的事务。有的情况下根据redo log重建数据块。没有的情况下直接读取就好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值