oracle成本cbo,基于成本的优化--CBO

选择CBO的优化方式

默认条件下,CBO将SQL语句的吞吐量作为优化目标

三种不同的优化方式

ALL_ROWS:该优化方式是Oracle的默认模式,优化目标是实现查询的最大吞吐量

FIRST_ROWS_n:该优化方式使用CBO的成本优化输出查询的前n行数据,目标是以满足快速相应的查询需求,

FIRST_ROWS  :该方式是FIRST_ROWS_n优化方式的老版本,作用是使用CBO的成本优化尽快输出查询的前几行数据,满足最小相应时间的需求

查询当前数据库的CBO优化方式

show parameter optimizer_mode

在实例级设置优化方式

alter system set optimizer_mode = FIRST_ROWS_10 scope=spfile

在会话级设置优化方式

alter session set optimizer_mode=ALL_ROWS

会话级上设置优化方式必须使用hint提示

select /*+first_rows_10*/ ename,sal,mgr

from scott.emp

优化器工作过程

步骤

1.SQL转换

在CBO优化中,一个SQL语句往往被转换成另一种表达形式,这个转换的基础是CBO认为转换后的查询会更有效

2.确定访问路径

一个SQL查询中对数据的访问的路径要根据访问这些数据消耗的资源来判断,在多个查询路径中选择计算成本最小的一个。

3.确定联结方式

在SQL语句中涉及多个表时,CBO会根据统计数据以及表的键的信息来选择连接方式,在多个连接方法中选择计算成本最低的一个作为最佳连接方法

4.确定联结次序

CBO会对不同的连接次序中进行计算以选择最好的执行计划。

自动统计数据

查看GATHER_STATS_JOB状态

select job_name,state,owner

from dba_scheduler_jobs;

通过数据字典DBA_TABLES查询用户SCOTT拥有表的统计分析情况

select last_analyzed,table_name,owner,num_rows,sample_size

from dba_tables

where owner='SCOTT'

手动统计数据库数据

DBMS_STATS

存储过程

GATHER_DATABASE_STATS        为全库中的表统计数据

GATHER_SCHEMA_STATS为某个模式统计数据

GATHER_TABLE_STATS为某个特定的表统计数据

GATHER_INDEX_STATS为某个索引表统计数据

上述统计数据保存在 DBA_TAB_STATISTICS 和 DBA_TAB_COL_STATISTICS

为模式SCOTT的所有表统计数据

execute DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'SCOTT');

验证模式SCOTT的数据统计成功

select last_analyzed,table_name,owner,num_rows,sample_size

from dba_tables

where owner='SCOTT'

为模式SCOTT用户的表EMP统计数据

execute DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP');

为DEPT的索引统计数据

execute DBMS_STATS.GATHER_INDEX_STATS('SCOTT','PK_DEPT')

手工收集数据库级别的统计数据-----需要对初始化参数JOB_QUEUE_PROCESSES设置一个非0值

execute DBMS_STATS.GATHER_DATABASE_STATS(estimate_percent=>null)

查询表的统计数据 DBA_TAB_STATISTICS

查询表的列的统计数据        DBA_TAB_COL_STATISTICS

统计OS数据

DBMS_STATS.GATHER_SYSTEM_STATSSYS.AUX_STAST$

无负载方式下收集10分钟的系统统计数据

execute DBMS_STATS.GATHER_SYSTEM_STATS('NOWORKLOAD',10)

收集系统统计数据

execute DBMS_STATS.GATHER_SYSTEM_STATS('start')

execute DBMS_STATS.GATHER_SYSTEM_STATS('stop')

每三分钟执行一次

查询统计的系统数据

select * from SYS.AUX_STAST$;

手工统计字典数据---具备SYSDBA权限

收集固定字典表的统计数据

execute DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

收集数据字典表的统计数据

execute DBMS_STATS.GATHER_DIRECTORY_STATS;

/

使用过程GATHER_SCHEMA_STATS统计数据字典数据

execute DBMS_STATS.GATHER_SCHEMA_STATS('sys')

主动优化SQL语句

SQL语句优化工具

1.使用EXPLAN FOR 指令

utlxplan.sql

执行脚本---生成PLAN_TABLE表

@?/rdbms/admin/utlxplan.sql

通过EXPLAIN PLAN FOR 指令分析SQL语句的执行计划

explain plan for select count(*) from scott.emp;

查看表 PLAN_TABLE 中SQL语句执行计划信息

col if for 999

col operation for a20

col options for a20

col object_name for a20

select id,operation,options,object_name,position

from PLAN_TABLE

OPERATION :为TABLEACCESS说明该步骤的行为是访问表

OPTIONS :为FULL,说明全表扫描访问表

OBJECT_NAME :说明行为的对象为表EMP

使用AUTOTRACE指令------SQL_TRACE=TRUE

设置参数 SQL_TRACE 启动SQL语句追踪

alter system set SQL_TRACE = TRUE;

/*选项结果

SET AUTOTRACE ON 查询输出,解释计划,统计信息

SET AUTOTRACE OFF 关闭 AUTOTRACE

SET AUTOTRACE ON EXPLAIN查询输出,解释计划,没有统计信息

SET AUTOTRACE ON EXPLAIN STAT 查询输出,解释计划,统计信息

SET AUTOTRACE ON STAT 查询输出,解释计划,统计信息

SET AUTOTRACE TRACE 解释计划,统计信息,生成结果但不显示

SET AUTOTRACE TRACE EXPLAIN 只有解释计划,不生成结果

SET AUTOTRACE TRACE STAT 只有统计,生成结果但不显示*/

使用AUTOTRACE追踪SQL语句执行计划

set autotrace traceonly

select count(*) from scott.emp

e65b630a92642facfff0bb437e306b5a.pngrecursive calls                       递归调用的次数

db block gets                         读数据块的数量

consistent gets                       总的逻辑I/O

physical reads                        物理I/O

redo size                             重做数量

bytes sent via SQL*Net to client      SQL*Net通信

bytes received via SQL*Net from client

SQL*Net roundtrips to/from client

sorts (memory)                        内存排序统计

sorts (disk)                          磁盘排序统计

rows processed                        被检索的行数

关闭AUTOTRACE

set autotrace OFF

启动 SQL Trace的前提

1.statistics_level: TYPICAL / ALL

BASE

2.timed_statistics:TRUE   -----BASE

False-----TYPICAL / ALL

3.user_dump_dest:该参数存储SQL语句的追踪文件。

(max_dump_file_size)

启动SQL Trace追踪

实例级启动SQL Trace追踪

alter system set SQL_TRACE=TRUE

会话级启动SQL Trace追踪

alter session set SQL_TRACE=TRUE

/

begin

sys.dbms_session.set_sql_trace(TRUE);

end;

使用 TKPPOF 解释 SQL Trace文件

执行sql查询

使用TKPPOF工具格式化SQL追踪文件

TKPPOF  xxxxxxxx.trc xxxx.txt sys=no

格式化参数的含义

count:不同执行阶段所读取的数据块数量

cpu     :不同执行阶段锁消耗的CPU时间,单位是秒

elapsed :执行用掉的时间

disk    :物理磁盘数据读操作数目

query   :一致的缓冲区读取数量

current :数据库块读取的数量

call    :该参数说明SQL语句的不同执行阶段

消除子查询优化SQL语句

对查询用户scott的emp表进行嵌套子查询

select *

from scott.emp e1

where e1.sal>

(select avg(sal)

from scott.emp e2

where e2.deptno=e1.deptno)

开启AUTOTRACE功能

set autotrace traceonly

跟踪SQL语句的执行

select *

from scott.emp e1

where e1.sal>

(select avg(sal)

from scott.emp e2

where e2.deptno=e1.deptno)

37f370e26eb7c0cfab336facf6a214c7.png跟踪改写的SQL语句

使用联机视图改写子查询

select * from scott.emp e1,(select e2.deptno deptno ,avg(e2.sal) avg_sal

from scott.emp e2 group by deptno ) dept_avg_sal

where e1.deptno = dept_avg_sal.deptno

and e1.sal > dept_avg_sal.avg_sal

c43675939166367066519434ccd84d5f.png被动优化SQL语句

使用分区表

使用表和索引压缩

创建压缩表

create table compress_emp

compress

tablespace users

as select * from scott.emp

查询是否成功创建压缩表compress_emp

select table_name,tablespace_name,compression

from user_tables

where table_name like 'COMPRESS%';

创建压缩索引

create index compress_emp_ename_idx

on compress_emp(ename)

compress;

保持CBO的稳定性

1.创建存储大纲的前提

初始化参数

QUERY_REWRITE_ENABLED = TRUE

STAR_TRANSFORMATION_ENABLED = TRUE

验证系统师傅具备创建存储大纲的前提

show paameter QUERY_REWRITE_ENABLED;

show paramter STAR_TRANSFORMATION_ENABLED;

show parameter optimizer_features_enable;

2.创建存储大纲

创建数据库级的存储大纲

alter system set create_stored_outlines = TRUE

创建会话级的存储大纲

alter session set create_stored_outlines = TRUE

为特定SQL语句创建存储大纲

create outline emp_outline

on

select *

from scott.emp

tablespace oltbs;

查询EMP_OUTLINE创建信息

select ol_name,sql_text,creator,timestamp

from ol$

where ol_name like 'EMP%'

查询Oracle自动生产的存储大纲的名字

set lines 120

select ol_name,sql_text

from ol$

3.删除存储大纲

删除存储大纲-----sysdba

drop outline emp_outline

4.启用存储大纲

修改参数 USE_STORED_OUTLINES 为TRUE

alter system set USE_STORED_OUTLINES= TRUE

目 录 第1章 成本的含义 1 1.1 优化器选项 2 1.2 成本的定义 3 1.3 变换和成本计算 5 1.4 所见未必即所得 8 1.5 本章小结 8 1.6 测试用例 8 第2章 表扫描 9 2.1 入门 10 2.2 提高 14 2.2.1 块大小的影响 14 2.2.2 CPU成本计算 16 2.2.3 CPU成本计算的作用 22 2.3 BCHR 24 2.4 并行执行 27 2.5 索引快速全扫描 30 2.6 分区 32 2.7 本章小结 37 2.8 测试用例 37 第3章 单表选择率 39 3.1 入门 40 3.2 空值 42 3.3 使用列表 43 3.4 区间谓词 48 3.5 双谓词 52 3.6 多谓词的相关问题 54 3.7 本章小结 56 3.8 测试用例 57 第4章 简单B树访问 59 4.1 索引成本计算的基础知识 60 4.2 入门 61 4.2.1 有效索引选择率 63 4.2.2 有效表选择率 64 4.2.3 clustering_factor 65 4.2.4 综合计算 67 4.2.5 扩展算法 68 4.2.6 3个选择率 74 4.3 CPU成本计算 78 4.4 待处理的零碎问题 80 4.5 本章小结 81 4.6 测试用例 81 第5章 群集因子 83 5.1 基本示例 84 5.1.1 减少表争用 (多个自由列表) 86 5.1.2 减少叶块的争用(反转键 索引,ReverseKey Index) 89 5.1.3 减少表的争用(ASSM) 92 5.1.4 减少RAC中的争用 (自由列表群) 95 5.2 列顺序 96 5.3 额外的列 99 5.4 校正统计信息 101 5.4.1 sys_op_countchg()技术 101 5.4.2 非正式策略 105 5.5 待处理的零碎问题 106 5.6 本章小结 107 5.7 测试用例 107 第6章 选择率的相关问题 109 6.1 不同的数据类型 110 6.1.1 日期类型 110 6.1.2 字符类型 110 6.1.3 愚蠢的数据类型 112 6.2 前导零 116 6.3 致命的默认值 117 6.4 离散数据的风险 119 6.5 令人惊奇的sysdate 123 6.6 函数表示 125 6.7 相互关联的列 126 6.7.1 动态采样 129 6.7.2 优化器配置文件 132 6.8 传递闭包 133 6.9 产生约束的谓词 136 6.10 本章小结 139 6.11 测试用例 139 第7章 直方图 141 7.1 入门 142 7.2 普通直方图 147 7.2.1 直方图和绑定变量 147 7.2.2 Oracle何时忽略直方图 149 7.3 频率直方图 152 7.3.1 伪造频率直方图 155 7.3.2 注意事项 156 7.4 “高度均衡”直方图 157 7.5 重新审视数据问题 163 7.5.1 愚蠢的数据类型 163 7.5.2 危险的默认值 166 7.6 本章小结 167 7.7 测试用例 168 第8章 位图索引 169 8.1 入门 170 8.1.1 索引组件 174 8.1.2 表组件 175 8.2 位图合并 177 8.2.1 较低的基数 179 8.2.2 空值列 182 8.3 CPU成本计算 185 8.4 一些有趣的示例 186 8.4.1 多列索引 187 8.4.2 位图连接索引 187 8.4.3 位图转换 188 8.5 本章小结 191 8.6 测试用例 192 第9章 查询变换 193 9.1 入门 194 9.2 过滤 197 9.2.1 过滤优化 200 9.2.2 标量子查询 202 9.2.3 子查询分解 208 9.2.4 复杂视图合并 213 9.2.5 推入谓词 215 9.3 一般子查询 216 9.3.1 子查询参数 218 9.3.2 分类 219 9.3.3 半连接 224 9.3.4 反连接 226 9.3.5 反连接异常 228 9.3.6 Null和Notin 229 9.3.7 有序提示 231 9.4 星型变换连接 232 9.5 星型连接 237 9.6 展望 239 9.7 本章小结 240 9.8 测试用例 241 第10章 连接基数 243 10.1 基本的连接基数 244 10.2 实际SQL的连接基数 249 10.3 扩展和异常情况 252 10.3.1 使用范围的连接 252 10.3.2 不等于 253 10.3.3 重叠 256 10.3.4 直方图 257 10.3.5 传递闭包 260 10.4 三表连接 264 10.5 空值 267 10.6 实现问题 270 10.7 困难之处 274 10.8 特性 276 10.9 另一观点 278 10.10 本章小结 279 10.11 测试用例 279 第11章 嵌套循环 281 11.1 基本机制 282 11.2 实际示例 286 11.3 完备性检查 287 11.4 本章小结 291 11.5 测试用例 291 第12章 散列连接 293 12.1 入门 294 12.1.1 最优散列连接 297 12.1.2 一遍散列连接 299 12.1.3 多遍散列连接 304 12.2 追踪文件 308 12.2.1 event 10104 308 12.2.2 event 10053 309 12.3 难点 311 12.3.1 传统成本计算 311 12.3.2 现代成本计算 312 12.4 比较 313 12.5 多表连接 318 12.6 本章小结 321 12.7 测试用例 321 第13章 排序与归并连接 323 13.1 入门 324 13.1.1 内存的使用 329 13.1.2 CPU的使用 330 13.1.3 sort_area_retained_size 333 13.1.4 pga_aggregate_target 334 13.1.5 实际I/O 337 13.2 排序的成本 339 13.3 比较 343 13.4 归并连接 346 13.4.1 归并机制 347 13.4.2 无最初排序的归并连接 351 13.4.3 笛卡尔归并连接 352 13.5 聚集及其他 354 13.5.1 索引 358 13.5.2 集合运算 359 13.6 最后一次提醒 363 13.7 本章小结 365 13.8 测试用例 366 第14章 10053 trace文件 367 14.1 查询 368 14.2 执行计划 369 14.3 环境 370 14.4 追踪文件 371 14.4.1 参数设置 372 14.4.2 查询块 375 14.4.3 存储统计信息 376 14.4.4 单表 378 14.4.5 完备性检查 379 14.4.6 一般计划 380 14.4.7 Join order[1] 380 14.4.8 Join order[2] 386 14.4.9 Join order[3] 387 14.4.10 Join order[4] 388 14.4.11 Join order[5] 388 14.4.12 Join order[6] 392 14.4.13 Join order[7] 392 14.4.14 Join order[8] 395 14.4.15 Join order[9] 397 14.4.16 Join order[10] 398 14.4.17 Join order[11] 398 14.4.18 Join order[12] 401 14.4.19 Join order[13] 404 14.4.20 Join order[14] 405 14.4.21 Join order[15] 406 14.4.22 Join order[16] 407 14.4.23 Join order[17] 407 14.4.24 Join order[18] 409 14.5 连接评估小结 410 14.6 测试用例 413 附录A 升级问题 415 A.1 dbms_stats 416 A.2 频率直方图 417 A.3 CPU成本计算 417 A.4 舍入误差 417 A.5 绑定变量窥视 418 A.6 连接间的空值 418 A.7 B树到位图的转换 418 A.8 索引跳跃扫描 419 A.9 AND-Equal 419 A.10 索引散列连接 420 A.11 修正的In-List 420 A.12 传递闭包 420 A.13 sysdate算术修正 421 A.14 对空值的索引 422 A.15 pga_aggregate_target 422 A.16 排序 422 A.17 分组 423 A.18 完备性检查 423 A.19 超出界限的情况 423 A.20 关于类型 423 A.21 optimizer_mode 424 A.22 降序索引 424 A.23 复杂视图合并 424 A.24 非嵌套子查询 424 A.25 标量和过滤子查询 425 A.26 并行查询策略的两次变化 425 A.27 动态采样 425 A.28 临时表 425 A.29 字典统计 426 附录B 优化器参数 427 B.1 optimizer_features_enable 428 B.2 10053 trace文件 430 B.3 v$sql_optimizer_env 435
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值