基于成本的优化--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_STATS SYS.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

					recursive 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)

	跟踪改写的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

	被动优化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

原文地址:http://blog.51cto.com/10579005/2072817

时间: 2024-10-03 23:20:51

基于成本的优化--CBO的相关文章

Apache Spark 2.2中基于成本的优化器(CBO)(转载)

Apache Spark 2.2最近引入了高级的基于成本的优化器框架用于收集并均衡不同的列数据的统计工作 (例如., 基(cardinality).唯一值的数量.空值.最大最小值.平均/最大长度,等等)来改进查询类作业的执行计划.均衡这些作业帮助Spark在选取最优查询计划时做出更好决定.这些优化的例子包括在做hash-join时选择正确的一方建hash,选择正确的join类型(广播hash join和全洗牌hash-join)或调整多路join的顺序,等等) 在该博客中,我们将深入讲解Spar

基于成本的优化--CBO-------v$SQL视图

详解v$SQL视图 查询消耗磁盘I/O最多的SQL语句 select sql_text,executions,disk_reads from v$sql where disk_reads>&number order by disk_reads desc; 使用变量&number使得用户可以自定义磁盘读取的次数,executions说明语句执行的时间量,包括该语句的等待时间和服务时间 分析缓冲区读取次数最多的SQL语句 查询逻辑读取数最多的SQL语句 select sql_text,b

基于RULE的优化器(学习笔记)

崔华<基于Oracle的sql优化学习笔记> 1.1 基于RULE的优化器 (1) CBO (2)RBO 和CBO相比,RBO是有其明显权限的.在使用RBO的情况下,执行计划一旦出了问题,很难对其做调整.另外,如果使用了RBO则目标SQL的写法,甚至是目标SQL中所涉及的各个对象在该SQL文本中出现的先后顺序都可能影响RBO执行计划的选择我,更糟糕的是,Oracle数据库中很好的特性.功能不能再RBO中使用因为他们不能被RBO锁支持. 只要出现如下情形之一,那么即便修改了优化器模式或者使用了R

深入MaxCompute理解数据、运算和用户的大脑:基于代价的优化器

回顾大数据技术领域大事件,最早可追溯到06年Hadoop的正式启动,而环顾四下,围绕着数据库及数据处理引擎,业内充斥着各种各样的大数据技术.这是个技术人的好时代,仅数据库领域热门DB就有300+,围绕着Hadoop生态圈的大数据处理技术更是繁花似锦.在云栖社区2017在线技术峰会大数据技术峰会上,阿里云大数据计算平台架构师林伟做了题为<MaxCompute的大脑:基于代价的优化器>的分享,为大家分享阿里巴巴大数据计算服务的大脑--基于代价的优化器的设计和架构. MaxCompute简介 大数据

基于案例SQL优化第九课作业分享

默认统计信息收集: 1. 11g默认启动了统计信息收集的任务,默认运行时间是周一到周五晚上10点和周6,周天的早上6点 2. 你也可以关闭自动统计新收集任务,选择手工收集的方式,但是一般不建议这样操作. 动态统计信息: 1. 统计信息默认情况下是每天晚上10点半后收集,如果新建对象还没来得级收集统计信息,就采用动态采样的方式. 2. 具体在set autotrace 跟踪的执行计划中,可以看到类似:- dynamic sampling used for this statement (level

华为G520-T10移动版刷机包 基于官方 最新优化 精简 省电

ROM介绍 基于官方最新升级包T10制作 精简系统中的大部分无用程序减小内存占用 更新Busybox和su二进制文件 精简掉CUST中无用文件 进一步优化系统内存占用 开启通话录音功能 对底层进行优化 优化网络参数 加入省电技术 开启主题管理器在线主题库 Rom下载地址:http://www.shuajizhijia.com/huawei/g520yd/8779/ 更多华为G520-T10刷机包下载:http://www.shuajizhijia.com/huawei/g520yd/

&lt;强化学习&gt;基于采样迭代优化agent

前面介绍了三种采样求均值的算法 ——MC ——TD ——TD(lamda) 下面我们基于这几种方法来 迭代优化agent 传统的强化学习算法 || ν ν 已经知道完整MDP——使用价值函数V(s) 没有给出完整MDP——使用价值函数Q(s,a) 可见我们的目标就是确定下来最优策略和最优价值函数 | |——有完整MDP &&  用DP解决复杂度较低 |     ====>  使用贝尔曼方程和贝尔曼最优方程求解 |——没有完整MDP(ENV未知) or 知道MDP但是硬解MDP问题复杂

基于VerilogHDL模型优化

1  引言 每个设计者在进行Verilog建模时都会形成自己的设计风格,同一个电路设计,用Verilog描述可以写出许多逻辑上等价的模型,而大多数设计者考虑 的主要是代码书写上的方便和功能上是否正确,对设计的模型是否最优化结构却考虑甚少,这样不仅加重了逻辑综合的负担,影响综合效率,而且很可能会导致设计 出的芯片未达到最优的面积和速度.因此,在Verilog建模时,很有必要进行模型优化. 2  模型优化概述 影响一个芯片性能的指标主要有两个:面积和速度.模型优化就是通过一定的手段对模型的结构进行调

基于贝叶斯优化的超参数tuning

https://arimo.com/data-science/2016/bayesian-optimization-hyperparameter-tuning/ 贝叶斯优化:使用高斯过程作为代理函数,并且通常优化提升幅度的期望Expected Improvement(新试验相对当前最好观测的提升的期望).高斯过程是一组函数的分布.高斯过程中的一个样本包括一组函数.训练高斯过程会拟合训练数据的分布,因此能产生和观测数据相近的函数.使用高斯过程,我们可以计算搜索空间中任意点的期望提升.然后将期望提升