iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle 学习之性能优化(八)优化器
  • 378
分享到

Oracle 学习之性能优化(八)优化器

2024-04-02 19:04:59 378人浏览 独家记忆
摘要

   我们知道,在sql语句解析的过程中,有一个过程叫优化。oracle中有一个叫优化器的组件,专门来处理sql的优化。在考虑查询条件和对象引用的许多相关因素后,优化器能确定出执行SQL语句最有效

   我们知道,在sql语句解析的过程中,有一个过程叫优化oracle中有一个叫优化器的组件,专门来处理sql的优化。在考虑查询条件和对象引用的许多相关因素后,优化器能确定出执行SQL语句最有效的方式来。对于任何SQL语句,优化器优化的结果,可以极大地影响执行时间。

  Oracle优化器的优化方法有两种:

  • CBO 基于成本的优化法则

  • RBO 基于规则的优化法则

  初始化参数optimizer_mode控制着优化器优化的行为

SQL> show parameter optimizer_mode

NAME				     TYPE			       VALUE
------------------------------------ --------------------------------- ------------------------------
optimizer_mode			     string			       ALL_ROWS

optimizer_mode有如下五个取值

  • CHOOSE 使用CBO还是RBO,基于统计信息是否存在,如果有统计系统则使用CBO,否则使用RBO。

  • ALL_ROWS 基于CBO,采用尽快返回所有结果的一种最优执行计划。

  • FIRST_ROWS_n 基于CBO,尽快的返回前n行数据,n的取值为1,10,100,1000

  • FIRST_ROWS 基于CBO和试探法相结合的方法,查找一种可以最快返回前面少数行的方法;这个参数主要用于向 后兼容。

  • RULE 采用基于CBO的优化法则。

Oracle 11g的版本只有中间三个参数有效,并且不推荐使用FIRST_ROWS .

我们看看优化器对查询的影响

SQL> alter system set optimizer_mode=all_rows;

System altered.

SQL> conn scott/tiger
Connected.
SQL> set autot traceonly exp
SQL> select * from emp,dept where emp.deptno=dept.deptno;

Execution Plan
----------------------------------------------------------
Plan hash value: 844388907

----------------------------------------------------------------------------------------
| Id  | Operation		     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT	     |	       |    14 |   812 |     6	(17)| 00:00:01 |
|   1 |  MERGE JOIN		     |	       |    14 |   812 |     6	(17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    80 |     2	 (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN	     | PK_DEPT |     4 |       |     1	 (0)| 00:00:01 |
|*  4 |   SORT JOIN		     |	       |    14 |   532 |     4	(25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL	     | EMP     |    14 |   532 |     3	 (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate InfORMation (identified by operation id):
---------------------------------------------------

   4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
       filter("EMP"."DEPTNO"="DEPT"."DEPTNO")

修改优化器模式后

SQL> alter session set optimizer_mode=first_rows_1;

Session altered.

SQL> select * from emp,dept where emp.deptno=dept.deptno;

Execution Plan
----------------------------------------------------------
Plan hash value: 3625962092

----------------------------------------------------------------------------------------
| Id  | Operation		     | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT	     |	       |     1 |    58 |     3	 (0)| 00:00:01 |
|   1 |  NESTED LOOPS		     |	       |       |       |	    |	       |
|   2 |   NESTED LOOPS		     |	       |     1 |    58 |     3	 (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL	     | EMP     |     1 |    38 |     2	 (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN	     | PK_DEPT |     1 |       |     0	 (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    20 |     1	 (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

CBO有如下三个组件构成

  • Query Transformer

  • Estimator

  • Plan Generator

 Oracle 学习之性能优化(八)优化器

一、Query Transformer

  输入部分是已经被解析器解析过的sql。

查询转换包括如下技术:

View Merging(视图合并)

  查询涉及到的每个视图被parser展开,并且分离成一个一个的查询块。查询块本质上代表了视图的定义。将其与查询剩余部分合并成一个总的执行计划,转换后的语句基本上不包含视图了。我们来举例说明

假设有这样一个视图

CREATE VIEW employees_50_vw AS
  SELECT employee_id, last_name, job_id, salary, commission_pct, department_id
  FROM   employees
  WHERE  department_id = 50;

进行如下查询

SELECT employee_id
FROM   employees_50_vw 
WHERE  employee_id > 150;

优化器转换后,查询变为

SELECT employee_id
FROM   employees
WHERE  department_id = 50 
AND    employee_id > 150;

Predicate Pushing(谓词推进)

  将谓词从内部查询块推进到一个不可合并的查询块中,这样可以使得谓词条件更早的被选择,更早的过滤掉不需要的数据行,提高效率,同样可以使用这种方式允许某些索引的使用。

假设有如下视图

CREATE VIEW all_employees_vw AS
  ( SELECT employee_id, last_name, job_id, commission_pct, department_id
    FROM   employees )
  UNION
  ( SELECT employee_id, last_name, job_id, commission_pct, department_id
    FROM   contract_workers );

我们发出这样的查询

SELECT last_name
FROM   all_employees_vw
WHERE  department_id = 50;

转换后

SELECT last_name
FROM   ( SELECT employee_id, last_name, job_id, commission_pct, department_id
         FROM   employees
         WHERE  department_id=50
         UNION
         SELECT employee_id, last_name, job_id, commission_pct, department_id
         FROM   contract_workers
         WHERE  department_id=50 );

Subquery Unnesting(子查询解嵌套)

最典型的就是子查询转变为表连接了,它和视图合并的主要区别就在于它的子查询位于where子句,由转换器进行解嵌套的检测。

假设有这样的一个查询

SELECT * 
FROM   sales
WHERE  cust_id IN ( SELECT cust_id FROM customers );

查询转换后

SELECT sales.* 
FROM   sales, customers
WHERE  sales.cust_id = customers.cust_id;

Query Rewrite with Materialized Views

假设建立一个物化视图

CREATE MATERIALIZED VIEW cal_month_sales_mv
  ENABLE QUERY REWRITE 
AS
  SELECT t.calendar_month_desc, SUM(s.amount_sold) AS dollars
  FROM   sales s, times t 
  WHERE  s.time_id = t.time_id
  GROUP BY t.calendar_month_desc;

执行如下查询

SELECT t.calendar_month_desc, SUM(s.amount_sold)
FROM   sales s, times t
WHERE  s.time_id = t.time_id
GROUP BY t.calendar_month_desc;

查询转换后

SELECT calendar_month, dollars
FROM   cal_month_sales_mv;


二、Estimator

Estimator决定了一个给定的执行计划的总成本。估计量生成三种不同类型的措施,以实现这一目标:

  • Selectivity

  这里的第一个度量值——选择性,表示sql命中的行数与行集的比值。所谓行集可以是表、视图,或者是一个连接或GROUP BY操作的中间结果。选择性与查询中的谓词有关,比如last_name=’Smith’,或者一个联合谓词last_name=’Smith’ and job_type=’Clerk’。一个谓词充当着一个过滤器的角色,在行集中过滤了一定量的行,谓词的选择性是一个比值,它表示一个行集经过谓词的过滤后剩下的行占原有行集的比例。其值在0.0和1.0之间,0.0表示在行集中没有行被选择;1.0表示行集中的所有行都被选择了。如果没有可用的统计信息,评估器为选择性赋予一个内部的缺省值,这个内部缺省值随着谓词的不同而不同。例如:等式谓词(last_name=’Smith’)的内部缺省值低于范围谓词(last_name>’Smith’),评估器会假定等式谓词返回的行数小于范围谓词。当存在可用的统计信息,评估器将使用统计信息来估算选择性。例如:对于一个等式谓词(last_name=’Smith’),选择性的值是distinct last_name的倒数即:(1/count(distinct last_name))。但是如果在last_name字段上存在直方图(histogram),则选择性值为:coun(last_name)where last_name=’Smith’ / count(last_name)where last_name is not null。可见在数据倾斜的字段上应用直方图能够帮助CBO进行准确的选择性评估

  • Cardinality

   基数就是行集中行的数量。基数分为: 

   基础基数(Base cardinality):就是基表中的行数。基础基数在表分析期间获得。如果表没有可用的统计信息,则评估器利用表中区(extents)的数量来估算基础基数。 

   有效基数(Effective cardinality):就是从基表中选择的行数。有效基数与具体的谓词和字段有关。有效基数是根据基础基数和作用于该表的所有谓词的选择性得出的,如果没有谓词作用于该表,则有效基数就等于基础基数。 

   连接基数(Join cardinality):就是两个行集在连接之后产生的行数。连接就是由两个行集产生的笛卡尔积,再由连接谓词过滤结果。因此,连接基数是两个行集基数与连接谓词选择性的乘积。 

   Distinct基数(Distinct cardinality):就是一个行集的字段distinct之后的行数。一个

行集的distinct基数是基于字段中的数据的。例如:一个拥有100行的行集,如果一个字段distinct之后还剩下20行,则distinct基数就为20。 

   Group基数(Group cardinality):就是一个行集在应用GROUP BY之后产生行的数量。Group基数依赖于每个组中字段的distinct基数和行集的行数。

  • Cost

   成本是用来描述工作单元或资源使用的。CBO是用磁盘I/O、CPU和内存的使用情况来作为工作单元的,因此CBO使用的成本可以描述为,在一次操作的执行过程中所用的磁盘I/O数量以及CPU和内存的总使用量。

三、Plan Generator

  主要功能是把给定的query生成各种可能的计划,并且挑出成本最低的一个。



您可能感兴趣的文档:

--结束END--

本文标题: Oracle 学习之性能优化(八)优化器

本文链接: https://www.lsjlt.com/news/38464.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle 学习之性能优化(八)优化器
       我们知道,在sql语句解析的过程中,有一个过程叫优化。Oracle中有一个叫优化器的组件,专门来处理sql的优化。在考虑查询条件和对象引用的许多相关因素后,优化器能确定出执行SQL语句最有效...
    99+
    2022-10-18
  • Oracle学习(八) --- SQL优化
    1、前置工具:执行计划 Explain Plan 1.1、概念 一条查询语句在 ORACLE 中的执行过程或访问路径的描述。即就是对一个查询任务,做出一份怎样去完成任务的详细方案。 执行计划:用于记录SQL执行每一个细节。 执行计划目的:...
    99+
    2019-07-03
    Oracle学习(八) --- SQL优化
  • Oracle 学习之性能优化(二)游标
      游标是cursor的中文翻译,那么到底什么是cursor呢?Oracle Concept中是这样描述的:  When an application issues a SQL stat...
    99+
    2022-10-18
  • Oracle 学习之性能优化(十一)物化视图
      物化视图主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。在数据仓库中,还经常使用查询重写(query rewri...
    99+
    2022-10-18
  • Oracle 学习之性能优化(九)使用hint
            基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行...
    99+
    2022-10-18
  • Oracle 学习之 性能优化(十四) 内存
     Oracle数据库包含了如下基本内存组件System global area (SGA)The SGA is a group of shared memory structures, known...
    99+
    2022-10-18
  • Oracle 学习之 性能优化(十五) ASH、ADDM、AWR
    ASH(Active Session History)  ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成。A...
    99+
    2022-10-18
  • Oracle 学习之性能优化(三)绑定变量
      根据Oracle 学习之性能优化(二)游标中的描述,我们知道如下两条语句是不共享的。select * from emp where&...
    99+
    2022-10-18
  • Oracle 学习之性能优化(六)访问路径
      访问路径是指Oracle找到用户需要的数据的方法,这些方法很少,包括:声名狼藉的全表扫描--人们不惜一切视图避免的(曲解的)访问路径。各种类型的索引扫描--这是人们感觉良好的访问路径(多数情况...
    99+
    2022-10-18
  • Oracle 学习之 性能优化(十二) 分区表
    一、分区概念   Oracle允许将表、索引、索引组织表细分成更小的片,每个片我们称之为分区。分区有其自己的名字和存储参数。  如下图:每行数据只能属于一个分区,分区键决定数据...
    99+
    2022-10-18
  • Oracle 学习之性能优化(一)SQL语句处理
      当向Oracle提交一个sql命令时,Oracle到底做了哪些事情?对这个问题有很好的理解,能帮助你更好的分析sql语句的优化。  执行一条sql语句从开始到结束,需要经历4个步骤:...
    99+
    2022-10-18
  • Oracle 学习之性能优化(四)收集统计信息
     emp表有如下数据。SQL> select ename,deptno from emp; ENAME   &n...
    99+
    2022-10-18
  • Oracle 学习之性能优化(七)join的实现方式
      本文讨论一下join技术背后的机制。我们知道常用的表连接有如下几种笛卡尔连接内连接左外连接右外连接全连接这些sql的写法,想必大家都很清楚了,那么这些连接的数据访问是如何实现的呢?nested...
    99+
    2022-10-18
  • MySql5.6性能优化学习笔记
    目标 了解什么是优化 掌握优化查询的方法 掌握优化数据库结构的方法 掌握优化MySQL服务器的方法 什么是优化? 合理安排资源、调整系统参数使MySQL运行更快、更节省资源。...
    99+
    2022-10-18
  • Oracle学习篇之SQL语句的优化
    Oracle学习篇之SQL语句的优化①在使用SELECT语句查询时,不要用“*”代替所有列名,因为这样的写法对Oracle系统来说会存在解析的动态问题。Oracle系统会通过查询数据字典来将“*”转...
    99+
    2022-10-18
  • 数据库学习之八:mysql 基础优化-索引管理
    八、mysql 基础优化-索引管理 1、课程大纲 索引介绍 索引管理 2、执行计划获取及分析 mysql数据库中索引的类型介绍 BTREE:B+树索引 (主要) HASH:HASH索引 FULLTEXT:全文索引 RTREE:R树...
    99+
    2016-09-20
    数据库学习之八:mysql 基础优化-索引管理
  • oracle性能调优学习0621
    1.PLAN_tablecolumn query_plan format a55column cardinality format 99999column cost format 99999delet...
    99+
    2022-10-18
  • oracle性能调优学习0622
    查询数据库中的等待事件:SET lines 100SET pages 10000COLUMN wait_class format a12COLUMN event format a30COLUMN total...
    99+
    2022-10-18
  • oracle 性能优化
    索引的说明 索引是与表相关的一个可选结构,在逻辑上和物理上都独立于表的数据,索引能优化查询,不能优化DML操作,Oracle自动维护索引,频繁的DML操作反而会引起大量的索引维护。 通常,为检索表数据...
    99+
    2022-10-18
  • Oracle 性能优化 之 游标及 SQL
    一、游标 我们要先说一下游标这个概念。       从 Oracle 数据库管理员...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作