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

简介: Oracle数据的优化器有两种优化方法:基于代价/成本的优化器(CBO)和基于规则的优化器(RBO),系统在对SQL进行优化的时候,使用哪种优化决定于初始化参数OPTIMIZER_MODE,该参数值可以设置为:CHOOSE,RULE,ALL_ROWS,FIRST_ROWS。

Oracle数据的优化器有两种优化方法:基于代价/成本的优化器(CBO)和基于规则的优化器(RBO),系统在对SQL进行优化的时候,使用哪种优化决定于初始化参数OPTIMIZER_MODE,该参数值可以设置为:CHOOSE,RULE,ALL_ROWS,FIRST_ROWS。在Oracle9i 以后的版本中还引入了新的优化参数命令:FIRST_ROWS_1,FIRST_ROWS_10, FIRST_ROWS_100,FIRST_ROWS_1000。(具体的说明将在以后的BLOG文章中介绍)Oracle推荐使用CBO优化方式,当系统使用CBO方式优化SQL的时候,要使其执行计划达到最优化,需要定期执行数据统计,必须保证统计数据的及时性,否则可能得不到预计的优化效果,或与预计的优化效果相差悬殊。

  要对数据库对象生成统计信息,可以有以下方法:

  完全统计法:analyze table table_name compute statistics;

  抽样估计法:analyze table table_name estimate statistics sample 30 percent;

  我们可以采用以下两种方法,对数据库的表和索引及簇表定期分析生成统计信息,保证应用的正常性能。

  1. 在系统设置定时任务,执行分析脚本。

  在数据库服务器端,我们以UNIX用户oracle,运行脚本analyze,在analyze中,我们生成待执行sql脚本,并运行。(假设我们要分析scott用户下的所有表和索引)

  Analyze脚本内容如下:

  sqlplus scott/tiger

  set pagesize 5000

  set heading off

  SPOOL ANALYTAB.SQL

  SELECT "ANALYZE TABLE SCOTT."||TABLE_NAME||" ESTIMATE STATISTICS SAMPLE 20 PERCENT ;" FROM USER_TABLES;

  SPOOL OFF

  SPOOL ANALYIND.SQL

  SELECT "ANALYZE TABLE SCOTT."||TABLE_NAME||" ESTIMATE STATISTICS SAMPLE 20 PERCENT FOR ALL INDEXES;" FROM USER_TABLES;

  SPOOL OFF

  SPOOL ANALYZE.LOG

  @ANALYTAB.SQL

  @ANALYIND.SQL

  SPOOL OFF

  EXIT

  在UNIX平台上crontab加入,以上文件,设置为每个月或合适的时间段运行

或者将如下脚本保存成analyze.sql,然后在sqlplus里面执行:

  set pagesize 5000

  set linesize 300

  set trims on

  set heading off

  set feedback off

  SPOOL analyTab.sql

  SELECT 'ANALYZE TABLE ZFMI.'||TABLE_NAME||' COMPUTE STATISTICS ;'

  FROM USER_TABLES;

  SPOOL OFF

  SPOOL analyIdx.sql

  SELECT 'ANALYZE TABLE ZFMI.'||TABLE_NAME||' COMPUTE STATISTICS

  FOR ALL INDEXES;' FROM USER_TABLES;

  SPOOL OFF

  SPOOL analyLog.log

  @@analyTab.sql

  @@analyIdx.sql

  SPOOL OFF

  2. 利用ORACLE提供的程序包(PACKAGE)对相关的数据库对象进行分析。

  有以下的程序包可以对表,索引,簇表进行分析。

  包中的存储过程的相关参数解释如下:

  TYPE可以是:TABLE,INDEX,CLUSTER中其一。

  SCHEMA为:TABLE,INDEX,CLUSTER的所有者,NULL为当前用户

NAME为:相关对象的名称。

  METHOD是:ESTIMATE,COMPUTE,DELETE中其一,当选用ESTIMATE,下面两项,ESTIMATE_ROWS和ESTIMATE_PERCENT不能同时为空值。

  ESTIMATE_ROWS是:估算的抽样行数。

  ESTIMATE_PERCENT是:估算的抽样百分比。

  METHOD_OPT是:有以下选项,

  FOR TABLE /*只统计表*/

  [FOR ALL [INDEXED] COLUMNS] [SIZE N] /*只统计有索引的表列*/

  FOR ALL INDEXES /*只分析统计相关索引*/

  PARTNAME是:指定要分析的分区名称。

  1)

  DBMS_DDL.ANALYZE_OBJECT(

  TYPE VARCHAR2,

  SCHEMA VARCHAR2,

  NAME VARCHAR2,

  METHOD VARCHAR2,

  ESTIMATE_ROWS NUMBER DEFAULT NULL,

  ESTIMATE_PERCENT NUMBER DEFAULT NULL,

  METHOD_OPT VARCHAR2 DEFAULT NULL,

  PARTNAME VARCHAR2 DEFAULT NULL ) ;

  该存储过程可对特定的表,索引和簇表进行分析。例如,对SCOTT用户的EMP表,进行50%的抽样分析,参数如下:

  DBMS_DDL.ANALYZE_OBJECT("TABLE", "SCOTT", "EMP", "ESTIMATE", NULL,50);
2)

  DBMS_UTILITY.ANALYZE_SCHEMA (

  SCHEMA VARCHAR2,

  METHOD VARCHAR2,

  ESTIMATE_ROWS NUMBER DEFAULT NULL,

  ESTIMATE_PERCENT NUMBER DEFAULT NULL,

  METHOD_OPT VARCHAR2 DEFAULT NULL ) ;

  DBMS_UTILITY.ANALYZE_DATABASE (

  METHOD VARCHAR2,

  ESTIMATE_ROWS NUMBER DEFAULT NULL,

  ESTIMATE_PERCENT NUMBER DEFAULT NULL,

  METHOD_OPT VARCHAR2 DEFAULT NULL );

  其中,ANALYZE_SCHEMA用于对某个用户拥有的所有TABLE,INDEX和CLUSTER的分析统计。ANALYZE_DATABASE用于对整个数据库进行分析统计。

  3) DBMS_STATS是在ORACLE8I中新增的程序包,它使统计数据的生成和处理更加灵活方便,并且可以并行方式生成统计数据。在程序包中的以下过程分别分析统计TABLE,INDEX,SCHEMA,DATABASE级别的信息。

  DBMS_STATS.GATHER_TABLE_STATS

  DBMS_STATS.GATHER_INDEX_STATS

  DBMS_STATS.GATHER_SCHEMA_STATS

  DBMS_STATS.GATHER_DATABASE_STATS

  在这里,我们以数据库JOB的方式,定时对数据库中SCOTT模式下所有的表和索引进行分析:

  在SQL*PLUS下运行:

  VARIABLE jobno number;

  BEGIN

  DBMS_JOBS.SUBMIT ( :jobno ,

  " dbms_utility.analyze_schema ( "scott", "estimate", NULL, 20) ; ",

  sysdate, "sysdate+30");

  commit;

  end;

  /

  Statement processed.

  Print jobno

  JOBNO

  -------------

  16

  以上作业,每隔一个月用DBMS_UTILITY.ANALYZE_SCHEMA对用户SCOTT的所有表,簇表和索引作统计分析

Oracle中的CBO方式
  Oracle的优化器有两种优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO),在Oracle8及以后的版本,Oracle强列推荐用CBO的方式
  RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。
  CBO方式:它是看语句的代价(Cost),这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时候过期统计信息会令优化器做出一个错误的执行计划,因些应及时更新这些信息。
  Examda提示:主索引不一定就是优的,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时全表扫描(full table scan)是最好
  优化模式包括Rule、Choose、First rows、All rows四种方式:
  Rule:基于规则的方式。
  Choose:默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
  First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
  All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走RBO的方式。

目录
相关文章
|
12天前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有 YashanDB 版本。原因是操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常源于 system() 函数调用失败,返回 -1,通常是因为 fork() 失败。未来 YashanDB 将优化日志信息以更好地诊断类似问题。
|
13天前
|
Oracle 关系型数据库 Linux
【YashanDB 知识库】通过 dblink 查询 Oracle 数据时报 YAS-07301 异常
某客户在使用 YashanDB 通过 yasql 查询 Oracle 数据时,遇到 `YAS-07301 external module timeout` 异常,导致 dblink 功能无法正常使用,影响所有版本。问题源于操作系统资源紧张,无法 fork 新子进程。解决方法包括释放内存、停掉不必要的进程或增大进程数上限。分析发现异常原因为系统调用 fork() 失败。经验总结:优化日志记录,提供更多异常信息。
|
2月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
4月前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
【赵渝强老师】Oracle的还原数据
|
4月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
85 7
|
4月前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
61 5
|
4月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
4月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的数据文件
在Oracle数据库中,数据库由多个表空间组成,每个表空间包含多个数据文件。数据文件存储实际的数据库数据。查询时,如果内存中没有所需数据,Oracle会从数据文件中读取并加载到内存。可通过SQL语句查看和管理数据文件。附有视频讲解及示例。
|
5月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
92 1
|
SQL Oracle 关系型数据库
oracle数据库带或不带数据导入导出操作大全
oracle数据库带或不带数据导入导出操作大全

热门文章

最新文章

推荐镜像

更多