Library Cache 的基本结构
图解 Library Cache
结构说明Hash Bucket库缓存相当于一个 Hash Table 由一组 Hash Bucket 构成,每个 Hash Bucket 存储相同哈希值的所有库缓存对象句柄,不同库缓存对象句柄间用指针连接,构成库缓存对象句柄链表(Library Cache Object Handles)
Hash Bucket主要用于可执行对象的快速定位和存取
Library Cache Object Handle库缓存对象句柄(Library Cache Object Handle)是存储库缓存对象的一种结构,这些句柄包含了对象的相关属性,例如:名称、标记、指向对象内存地址的指针等。Object Handle 的主要属性:
Name库缓存对象句柄对应的库缓存对象名称
Namespace库缓存对象句柄对应的库缓存对象的分组名
| Namespace 值 | 含义 | | ——————— | ———————————————————————————- | | C ...
看懂执行计划之表连接
简介 表连接,顾名思义多个表之间用用连接条件连接在一起,使用表连接的目标 SQL 其目的就是从多个表获取存储在这些表中不同维度的数据。
解析表连接 SQL 的要素
目标 SQL 文本的写法SQL 文本的写法决定表连接的类型:内连接、外连接、自连接
自连接:同一张表内的字段做连接
表连接顺序不管目标 SQL 中有多少个表做连接,Oracle 在实际执行该 SQL 时都只能先两两 连接,再依次同剩下的表做连接,直到目标 SQL 中所有的表都已连接完毕。
表连接方法排序合并连接、嵌套循环连接、哈希连接和笛卡尔积连接
表连接类型
内连接(Join)连接结果只包含那些完全满足连接条件的记录
外连接
左外连接(Left Join)表连接结果包含左边表的全部行,右边表满足连接条件的查询列正常显示,不满足展示 Null
右外连接(Right Join)表连接结果包含右边表的全部行,左边表满足连接条件的查询列正常显示,不满足展示 Null
全外连接(Full Join)表连接结果包含两张表的全部记录,满足连接条件的查询列正常显示,不满足连接条件的记录对应另外一张表展示 Nul ...
看懂执行计划之表相关执行计划
全表扫描(Full Table Scans, FTS) 全表扫描是指 Oracle 在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位线(HWM,High Water Mark),这段范围内所有的数据块 Oracle 都必须读到。Oracle 会对这期间读到的所有数据施加目标 SQL 的 where 条件过滤,最后返回满足要求的数据。 Oracle 在做全表扫描操作时会使用多块读,在目标表数据量不大时执行效率是非常高的。全表扫描最大的问题是执行时间不稳定、不可控,会随着目标表数据量的递增而递增。 高水位线特性的副作用:即使 DELETE 删光了目标表里的所有数据,高水位线还是会在原来的位置,全表扫描的时候还是会扫描高水位线下所有的数据块。
会引起全表扫描的 SQL
全模糊查询
查询条件中含有 is null
查询条件中使用了不等于操作符(<>、!=)
对于组合索引,如果查询条件中没有前导列,也会引起全表扫描
对字段进行表达式操作
返回的行无 ...
看懂执行计划之优化器的模式
简介 优化器是 Oracle 的内置软件,可以确定执行目标 SQL 的最有效方式。优化器的模式决定 Oracle 解析目标 SQL 时所用优化器的类型,以及决定使用 CBO 时计算成本的侧重点。优化器的模式不同,CBO 计算成本值的方法也不同。控制 Oracle 优化器模式的参数为 optimizer_mode。
查看参数
1show parameter optimizer_mode
修改参数
1alter session set optimizer_mode='CHOOSE'
RULE表示优化器采用 RBO 来解析目标 SQL。是 Oracle 早期版本的一种优化模式。目前 Oracle 已不再更新 RBO,也不推荐使用 RBO。
CHOOSE由 RBO 到 CBO 转换时的默认值。表示既可以使用 RBO 又可以使用 CBO。取决于 SQL 涉及的对象是否有统计信息,有统计信息 CBO(部分有时会采样统计),否则 RBO。
FIRST_ROWS_n(n=1,10,100,1000)Oracle 采用 CBO 解析目标 SQL。侧重点是 ...
看懂执行计划之基于成本的优化器(CBO)
基于代价的优化方式 Cost-Based Optimization,简称 CBO。CBO 选择目标 SQL 执行计划的判断原则是成本,从目标 SQL 的诸多执行计划中选取成本值最小的执行路径为其执行计划,各执行路径的成本值是根据目标 SQL 中涉及到的表、索引、列等相关对象的统计信息计算出来的,实际反应执行目标 SQL 所要消耗的 I/O、CPU 和网络资源的一个估计值。
I/O把数据从磁盘读入内存时所需代价(Select 重点指标)
CPU处理内存中数据所需的代价(排序(sort)、连接(join)操作)
网络资源网络资源是指那些用了 dblink 的分布式目标 SQL,CBO 在解析该类目标 SQL 时知道在实际执行时所需要的的数据并不在本地数据库中(需要远程数据库取数),便会将网络资源消耗折算成对等的 I/O 资源消耗再进行估算。
动态采样执行 SQL 所涉及对象(表、索引等)没有被分析、统计过,Oracle 就会使用动态采样,动态的收集表和索引上的一些数据信息,但这些统计信息不会记录在视图中,只在硬解析时才会使用动态采样。
CBO 组成
查询转化器(Q ...
看懂执行计划之基于规则的优化器(RBO)
简介 基于规则的优化器(RBO)是通过编码在 Oracle 数据库中的一系列固定的规则,来决定目标 SQL 的执行计划。Oracle 事先给各种类型的执行路径定一个等级,从 1 到 15,等级 1 对应执行路径的执行效率最高,等级 15 对应执行路径的执行效率最低。对于等级相同的执行计划,oracle 根据目标对象在数据字典中缓存的顺序判断选择哪一种执行计划。在决定目标 SQL 的执行计划时,RBO 会从该 SQL 的诸多执行路径中选择一条等级最低的执行路径来作为其执行计划。 RBO 中等级 1 对应的执行路径是“single row by rowid(通过 rowID 来访问单行数据)”,等级 15 所对应的执行路径时“full table scan(全表扫描)”。
RBO 的缺陷
RBO 的执行计划很难调整
目标 SQL 的写法及各个对象在该 SQL 文本中出现的先后顺序都会影响执行计划
Oracle 数据中的很多新特性、功能,均不支持 RBO
没有考虑目标 SQL 所涉及对象的实际数据量
RBO 执行计划的调整
等价改写 SQL
Nu ...
看懂执行计划之位图索引
定义 目前一般我们使用的索引都是 B-Tree 索引,索引结构中存储的是键值和对应 ROWID。位图索引是指用位图表示的索引,通常创建在有大量重复值的列上,针对每个键值建立不同的位图。索引结构中主要存储键值、起止 ROWID 和位置编码,位置编码中的每一位表示键值对应数据行的有无,一个块可能指向多行数据的位置。
位图索引通过位图向量,表示索引键值在表中的分布
存在大量更新操作的列上不宜建位图索引,因为更新向量时相应键值涉及到的数据行都将被锁定
与 B-Tree 索引的区别
位图索引一个键值对应一个叶子节点,B-Tree 索引一个叶子节点包含多个索引键值
位图索引使用位图向量标识键值对应数据行的分布,B-Tree 采用 Row_id 定位数据行
位图索引创建不需要排序,B-Tree 索引需要排序
位图索引允许键值为 Null,B-Tree 索引对 Null 值敏感
位图索引可以进行位运算(and、or)
位图索引优缺点优点
位图索引由于只存储键值的起止 Rowid 和位图,占用的空间非常少.
位图索引创建时不需要排序,创建速度快
位图索引对 Null 值不敏感 ...
看懂执行计划之 B-Tree 索引
B-Tree 索引内部结构
B-Tree 是一种常见的数据结构,可以显著减少定位记录时所经历的中间过程,从而加快存取速度,主要用于 OLTP 系统(事务系统)。B-Tree 索引包含的主要组件如下:
根节点(Root Node):一个 B-Tree 索引只有一个根节点,它实际就是位于树的最顶端的分支节点。
分支节点(Branch Node):包含指向相应索引分支块或叶子块的指针和索引键值列。
叶子节点(Leaf Node):包含被索引键值和该键值对应的 ROWID
索引项(Index Entry):对应每一条行记录
分支节点(Branch Node) 分支节点主要包括两部分:指针和索引键值列。
指针指针是指相关分支块或叶子块的块地址 RDBA。每个分支块都会有两种类型的指针,一种是 LMC(Left Most Child),比当前节点中最小的索引值还小的下一级节点块的数据块地址;另外一种是索引行记录指针即下一级节点块地址,该指针指向块的索引键值列最小值一定大于或等于该行记录的索引键值
索引键值列索引键值列只要 Oracle 能区分相应 ...
看懂执行计划之索引介绍
简介 索引是建立在表上的可选数据库对象,是一组排序后的的索引键。主要用于加快数据的检索,类似于书籍的目录,快速定位到目标数据。索引在物理上和逻辑上都是独立的,创建或删除索引对基表不会有影响。当对基表进行 DML 操作时 Oracle 会自动管理索引,无需手动处理。
索引分类结构分类
分区索引
索引按范围(Range)或散列(Hash,Oracle 10g中引入)进行分区一个分区索引可能指向任何(或全部的)表分区。
B-Tree 索引
B-Tree索引是一个典型的树结构,通常包含根节点、分支节点、叶子节点包括正常索引或反转关键字索引
位图索引
位图索引主要针对大量相同值的列而创建位图索引不直接存储ROWID,而是存储字节位到ROWID的映射位图索引的空间占用明显小于B-Tree索引位图索引不适合经常更新的表关键字BitMap
逻辑分类
单列索引
索引列为单个字段
组合索引
索引列为多个字段,最多为32列,顺序自定义
唯一索引
索引列的值唯一,Oracle会自动在表的主键列上创建唯一索引,关键字UNIQUE INDEX
非唯一索引
索引列的值允 ...
深入解析Oracle数据库的综合体系结构与各组成部分的作用
Oracle数据库作为一款强大的关系型数据库管理系统,具有复杂而完善的综合体系结构。这个体系结构由物理结构、内存结构、进程结构和逻辑结构组成,它们相互协作,共同为数据库提供高效的数据存储、管理和访问。本文将深入解析Oracle数据库的综合体系结构,探讨各组成部分之间的联系以及它们对数据库的影响与作用。
物理结构物理结构是指数据库在磁盘上的存储方式和组织形式。它涉及到数据文件、数据块、操作系统文件系统等层面的存储结构。物理结构的设计和调优对于数据库的性能和性能是至关重要的,它直接影响着数据的读取和写入速度,以及数据库的可靠性和可用性。
内存结构内存结构是指Oracle数据库在内存中分配和管理的存储区域。它包括了共享池、数据库缓存、重做日志缓冲区等重要的内存组件。内存结构的设计和配置对于数据库的性能优化和响应速度具有重要影响。合理配置内存结构可以降低磁盘IO操作的频率,提升数据检索和事务处理的效率。
进程结构进程结构是指Oracle数据库的进程组成和协作方式。它包括了实例进程、后台进程和用户进程等多个进程。不同的进程负责着不同的任务和功能,它们相互配合,保证数据库实例的正常运行和对外服务 ...