获取执行计划之 10053 事件
10053 10053事件提供了Oracle如何选择执行计划,为什么会得到这样的执行计划信息。 10053事件的trace文件,只能阅读原始的trace文件,不能使用tkprof工具来处理。
10053 事件级别
Level 2Column statisticsSingle Access PathsJoin CostsTable Joins ConsideredJoin Methods Considered (NL/MS/HA)
Level 1Parameters used by the optimizerIndex statisticsColumn statisticsSingle Access PathsJoin CostsTable Joins ConsideredJoin Methods Considered (NL/MS/HA)
执行步骤
启用 10053 事件
1ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';
执行目标 SQL
1select * fr ...
获取执行计划之 10046 事件
10046 10046 事件可以得到 Oracle 内部执行系统解析、调用、等待、绑定变量等详细的信息,可以帮助我们解析一条/多条 SQL、PL/SQL 语句的运行状态,这些状态包括:Parse/Fetch/Execute 三个阶段中遇到的等待事件、消耗的物理和逻辑读、CPU 时间、执行计划等,还能帮我们分析一些 DDL 维护命令的内部工作原理,RMAN、Data Pump Expdp/impdp 等工具缓慢问题。
执行步骤方法一
激活 10046 事件
1alter session set events '10046 trace name context forever,level 12';
执行目标 SQL
1select * from emp;
查看生成的 trace 文件
1select distinct(m.sid),p.pid,p.tracefile from v$mystat m,v$session s,v$process p where m.sid=s.sid and s.paddr=p.addr;
关闭 10046 ...
获取执行计划之 dbms_xplan.display_cursor()
前提SQL执行计划仍在Shared Pool中
函数体示例:
1234DBMS_XPLAN.DISPLAY_CURSOR(sql_id IN VARCHAR2 DEFAULT NULL,child_number IN NUMBER DEFAULT NULL,format IN VARCHAR2 DEFAULT 'TYPICAL');
参数
sql_id指位于库缓存执行计划中 SQL 语句的父游标。默认值为 null。当使用默认值时当前会话的最后一条 SQL 语句的执行计划将被返回可以通过查询 V$SQL 或 V$SQLAREA 的 SQL_ID 列来获得 SQL 语句的 SQL_ID。
child_number指定父游标下子游标的序号。即指定被返回执行计划的 SQL 语句的子游标。默认值为 0。如果为 null,则 sql_id 所指父游标下所有子游标的执行计划都将被返回。
format控制 SQL 语句执行计划的输出部分。
Format 参数详解
官方输出格式
BASIC: 显示最少的信息,只包括操作类型,ID ...
获取执行计划之 explain plan for
示例12explain plan for select * from emp;select * from table(dbms_xplan.display());
explain plan命令通常和dbms_xplan.display()命令结合使用PL/SQL Developer里F5快捷键的原理就是调用explain plan命令
原理 explain plan 命令的原理是 Oracle 将目标 SQL 所产生的执行计划写入 PLAN_TABLE$(ON COMMIT PRESERVE ROWS 的 GLOBAL TEMPORARY TABLE 即会话级临时表仅对当前会话有效)然后再通过dbms_xplan.display()命令将PLAN_TABLE$中的具体执行步骤格式化显示出来
优缺点
优点
无需真正执行,快捷方便
缺点
没有输出相关统计信息
无法判断是处理了多少行
无法判断表被访问了多少次
获取执行计划之 Autotrace
Autotrace 简介AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计。
AUTOTRACE的好处是您不必设置跟踪文件的格式,并且它将自动为SQL语句显示执行计划。
Autotrace 选项说明
命令
输出内容
简写
是否真实执行
SET AUTOTRACE OFF
缺省模式,只显示 SQL 执行结果
SET AUTOT OFF
是
SET AUTOTRACE ON
显示 SQL 结果、执行路径和资源消耗
SET AUTOT ON
是
SET AUTOTRACE TRACEONLY
显示 SQL 结果数量、执行路径和资源消耗
SET AUTOT TRACE
是
SET AUTOTRACE TRACEONLY EXPLAN
只显示 SQL 执行路径
SET AUTOT TRACE EXP
Select 语句没有,DML 会被执行
SET AUTOTRACE TRACEONLY STATISTICS
只显示资源消耗
SET AUTOT TRACE STAT
统计信息
统计信息
...
深入了解DBMS_STATS包:优化Oracle数据库统计信息管理
收集统计信息首先,让我们通过一个例子来了解如何使用DBMS_STATS包收集表的统计信息。假设我们有一个名为”employees”的表,我们希望为该表收集统计信息。我们可以使用以下命令执行此操作:
1EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES');
其中,’HR’为用户名,’EMPLOYEES’为表名。通过执行以上命令,DBMS_STATS包会收集’employees’表的统计信息,如行数、列的唯一值数量、索引信息等。
自动收集统计信息除了手动收集,我们还可以让DBMS_STATS包自动定期收集统计信息,以确保数据库的最新性能。首先,我们需要创建一个统计信息收集作业。以下是一个创建作业的示例:
12345678910BEGIN DBMS_SCHEDULER.CREATE_JOB( job_name => 'STATS_COLLECTION_JOB', job_type => 'PLSQL_BLO ...
Oracle执行计划简介:优化数据库查询的关键
什么是执行计划执行计划是Oracle数据库根据查询语句、表、索引和统计信息等生成的一种执行路线图,它描述了数据库优化器在执行查询语句时的执行步骤和操作方式。执行计划包括了查询的访问方式、连接方式、操作顺序等关键信息。
组成
目标 SQL 的正文、sql_id 和执行计划对应的 plan_hash_value
执行计划主体,主要有内部执行步骤、执行顺序、谓词信息、列信息、Cardinality、Cost 等
执行计划的额外补充信息,是否动态采用(dynamic sampling)、是否 Cardinality Feedback、是否 SQL Profile
模块解读主体 Header
ID:序号
Operation: 当前操作的内容
Rows: 当前操作的 Cardinality,Oracle 估计当前操作的返回结果集。
Cost:SQL 执行的代价
Time:Oracle 估计当前操作的时间
Query Block Name
12345678Query Block Name / Object Alias (identified by operation id): ...
提升数据库性能的关键:Oracle统计信息
什么是统计信息?统计信息是数据库中关于表、索引和列的统计数据,用于优化查询计划的生成。Oracle数据库会定期收集这些统计信息,并据此进行优化决策,以提供最佳的查询性能。统计信息主要包括表的行数、列的唯一值个数、索引高度等。
为什么统计信息如此重要统计信息的准确性直接影响着查询的执行效率。如果统计信息不准确,数据库可能会选择错误的查询计划,导致查询性能下降甚至出现严重的性能问题。因此,及时收集和更新统计信息是提升数据库性能的关键步骤之一。
如何收集统计信息Oracle提供了多种方式来收集统计信息:
自动收集:Oracle会自动定期收集表的统计信息,可以通过设置相关参数来调整收集的频率和深度。
手动收集:可以使用DBMS_STATS包中的过程来手动收集统计信息,可以选择对整个数据库、表、索引或列进行统计信息的收集。
统计信息导入导出:可以将统计信息导出为统计信息的XML格式文件,然后在其他数据库中导入使用。
如何使用统计信息优化性能在收集统计信息后,Oracle优化器会根据统计信息进行查询计划的生成。有几点需要注意:
统计信息的准确性:确保收集的统计信息准确无误,可以使用DBMS_ ...
Java数组解析:探索数据存储与操作的利器
数组的基础知识数组是一种存储连续数据的结构,它由相同类型的元素组成。在Java中,数组的长度是固定的,一旦创建后,无法改变。每个元素都通过索引访问,索引从0开始。这个特性使得数组在很多编程任务中非常有用。
数组的声明和初始化在Java中,声明和初始化数组可以分为两步,首先声明数组变量,然后使用new关键字为数组分配内存并初始化。
1234567891011// 声明一个整数数组int[] numbers;// 初始化一个长度为5的整数数组numbers = new int[5];// 声明并初始化一个字符串数组String[] names = new String[]{"Alice", "Bob", "Charlie"};// 使用简化的语法初始化一个字符数组char[] vowels = {'a', 'e', 'i', 'o', 'u'};
通过指定数组的大小和类型,我们可以声明一个数组 ...
巧妙运用Java表达式:编程中的算术与逻辑之道
算术表达式:实现精确计算在Java中,算术表达式用于进行数学运算,例如加法、减法、乘法和除法等。比如:
123456int a = 10;int b = 5;int sum = a + b; // 加法int difference = a - b; // 减法int product = a * b; // 乘法int quotient = a / b; // 除法
另外,Java还提供了取模运算符(%),用于获取两个数相除的余数。
1int remainder = a % b; // 取模运算
合理利用算术表达式的组合和嵌套,可以实现复杂的数学计算,并在编程中达到精确计算的目的。
逻辑表达式:实现条件判断逻辑表达式在编程中非常重要,它用于实现条件判断和逻辑控制。我们常用的逻辑操作符有:
逻辑与(&&):当两个操作数都为true时,结果为true。
逻辑或(||):当两个操作数中有一个为true时,结果为true。
逻辑非(!):用于取反操作,将true变为false,将false变为true。
12345boolean isTrue = true;boolean i ...