- 最新高二英语教学反思【优秀5篇】2024-12-13
- 英文推荐信_122024-12-13
- 留学瑞典2024-12-13
- 澳洲出国留学详解!附真实经历2024-12-13
- 移民加拿大最容易的三个省,门槛低,名额充足!2024-12-13
- 出国留学好处多还是坏处多?2024-12-13
- 大学排名_22024-11-26
- 985/211院校均分85能申请英国哪些大学研究生?这八大名校妥妥滴2024-11-26
- 美术生留学哪里好?2024-11-26
- 专科留学去哪个国家比较好?2024-11-26
奇亿娱乐-奇亿注册登录站
邮箱:youweb@admin.com
手机:13899999999
电话:020-88888888
地址:广东省广州市番禺经济开发区
优化器(Optimizer) 是Oracle数据库中内置的一个 核心子系统。
其目的是:按照一定的判断原则来得到它认为的目标SQL在当前情形下最高效的执行路径(Access Path)。
根据判断原则,可分为 RBO 和 CBO 两种类型的优化器:
以下是Oracle数据库里的SQL语句的执行过程:
Oracle一共有15个等级的执行路径,默认等级值低的执行路径的执行效率会比等级值高的执行效率要高;所以RBO会从决定目标SQL的执行计划中选择一条等级值最低的执行路径来作为执行计划。
开启RBO模式:
如果RBO选择的执行计划不是当前情形下最优的执行计划,有以下几个办法调整:
使用 RULE Hint 和 DRIVING_SITE Hint 可以调整RBO的执行计划且不自动启用CBO;
等价改下目标SQL:
比如在sql的where条件中对number或者date类型的列加0,
如果是varchar2类型的,加可以加个空字符串
对于执行路径一样的情况:假如出现执行路径一样的情况,这时候就要根据数据字典缓存先后顺序来确定等级,确定哪条作为执行计划。
通过调整相关对象在数据字典缓存中的缓存顺序,改变目标SQL中所涉及的各个对象在该SQL文本中出现的先后顺序来调整执行计划。
CBO会从目标SQL诸多可能的执行路径中选择一条成本值最小的路径来作为执行计划;
各路执行路径的成本值是根据目标SQL语句所涉及的表、索引、列等相关对象的统计信息计算出来的;
成本 即 对执行目标SQL所要耗费的I/O、CPU和网络资源的一个估算值;
即CBO会认为消耗系统I/O和CPU资源最少的执行路径即最佳选择。
表示对目标SQL的某个具体步骤的执行结果所包含记录数的估算;
其值越大,对应成本值越大。
其公式表示:
S
e
l
e
c
t
i
v
i
t
y
=
施
加
指
定
谓
词
条
件
后
返
回
结
果
集
的
记
录
数
未
施
加
任
何
谓
词
条
件
的
原
始
结
果
集
的
记
录
数
Selectivity =\frac{施加指定谓词条件后返回结果集的记录数}{未施加任何谓词条件的原始结果集的记录数} \quad
Selectivity=未施加任何谓词条件的原始结果集的记录数施加指定谓词条件后返回结果集的记录数?
可见,可选择率为1时可选择性最差。
也可以这么表示:
S
e
l
e
c
t
i
v
i
t
y
=
C
o
m
p
u
t
e
d
?
C
a
r
d
i
n
a
l
i
t
y
O
r
i
g
i
n
a
l
?
C
a
r
d
i
n
a
l
i
t
y
Selectivity =\frac{Computed\ Cardinality}{Original\ Cardinality} \quad
Selectivity=Original?CardinalityComputed?Cardinality?
即 Computed Cardinality = Original Cardinality * Selectivity
在目标列没有直方图且NULL值的情况下,用目标列做等值查询的选择率是:
S
e
l
e
c
t
i
v
i
t
y
=
1
N
u
m
_
D
i
s
t
i
n
c
t
Selectivity =\frac{1}{Num\_Distinct} \quad
Selectivity=Num_Distinct1?
从 Oracle 10g开始,Oralce在解析目标SQL时,默认使用CBO。
CBO在查询转换中做的第一件事,即对原目标SQL做简单的等价改写(仅适用于CBO):
在原目标SQL上加上根据该SQL现有的谓词条件推算出来的新的谓词条件。
简单来说就是从: a = b and b = c 推算出 ----> a = c.
不同模式下的计算成本值的方式不同
其控制参数为 决定 :
指包含指定执行结果的集合
对于CBO而言,对应执行计划中的Rows反映的就是CBO对于相关执行步骤所对应的输出结果集的记录数(即Cardinality)的估算值。
是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个(BLOCK)开始扫描,一直扫描到该表的高水位线,这段范围内所有的数据块都必须读到。
(这期间读到的所有数据会施加where过滤条件,返回满足条件的数据。)
高水位线的副作用是,即使delete删除完了所有的数据,高水位线依旧保持原来位置。
Oracle在做全表扫描操作时会使用多块读,其执行时间一定会随着目标表数据量的递增而递增。
ROWID:表的数据行所在的物理存储地址;
Oracle通过数据所在的ROWID去定位并访问这些数据。
通过Oracle内置的ROWID伪列得到对应的行记录所在的ROWID的值;
再通过 DBMS_ROWID包中的(
)将上述ROWID伪列的值翻译成对应数据行的实际物理存储地址。
示例:
查看empno为7369的ROWID伪列的值,以及通过DBMS_ROWID后对该伪列翻译后的值。
AAASbFAAHAAAACmAAA 为数据行对应的ROWID伪列值,通过DBMS_ROWID对该伪列翻译后的值为7_166_0,即该行记录的实际物理存储地址位于7号文件的第166个数据块的第0行记录。
首先了解下B树索引:
参考《Oracle索引介绍——关于Oracle索引的作用、具体分类、查看和修改》
B树索引是Oralce数据库中最常用的索引类型(也是默认的),它是以B树结构组织并且存放索引数据的。默认情况下,B树索引中的数据是以升序方式排序的。
B树索引由根节点块、分支节点块和叶子节点块组成。其中主要数据都集中在叶子节点块所指向的数据行。
根节点块:索引顶级块,它包含指向下一级节点的信息。
分支节点块:包含指向相应索引分支块/叶子块的 指针 和索引键值列
指针:指相关分支块/叶子块的块地址RDBA,分为两种:
1)Lmc,Left Most Child 的缩写,每个索引分支块只有一个Lmc,它指向的分支块/叶子块中的所有索引键值列中的最大值一定小于该Lmc所在索引分支块的所有索引键值列中的最小值;
2)索引分支块的索引行记录所记录的指针:它指向的分支块/叶子块中的所有索引键值列中的最大值一定大于或等于该行记录的索引键值列中的最小值;(索引键值列可为不完整的被索引键值的前缀)
叶子节点块:通常也称为叶子,它包含索引入口数据,索引入口包含索引列的值和记录行对应的物理地址。
在B树索引中无论用户要搜索哪个分支的叶块,都可以保证所经过的索引层次是相同的。
即 先访问相关的B树索引(从根节点定位到相关的分支块,再定位到相关的叶子块,再对叶子块执行扫描),然后根据访问该索引后的得到的ROWID,再回表去访问对应的数据行记录。
Oracel采用这种方式的索引,可以确保无论索引条目位于何处,都只需花费相同的I/O即可获取它,这就是为什么被称为B树索引。