ORACLE 性能调整

36
ORACLE 性性性性 • 性性性性性 • 性性 性性性性性性 • 性性性性性性性性性

description

ORACLE 性能调整. 跟踪与分析 索引、蔟与全表扫描 使用优化器调整性能. 跟踪与分析. SQL_Trace 实用工具 EXPLAIN PLAN 方法 TKPROF 实用程序 使用 dbv/RMAN 磁盘读和缓冲区获取. SQL_Trace 实用工具. SQL_Trace 有效则对每条语句有 : 解析、执行、取数据的计数; CPU 时间和占用时间; 物理读和逻辑读; 处理行数目; 所解析的用户名; 每次提交和回滚的情况。. SQL_Trace 实用工具. 只在 SQL 语句内启用 SQL_TRACE 使用 : - PowerPoint PPT Presentation

Transcript of ORACLE 性能调整

Page 1: ORACLE 性能调整

ORACLE 性能调整

• 跟踪与分析

• 索引、蔟与全表扫描

• 使用优化器调整性能

Page 2: ORACLE 性能调整

跟踪与分析• SQL_Trace 实用工具

• EXPLAIN PLAN 方法

• TKPROF 实用程序

• 使用 dbv/RMAN

• 磁盘读和缓冲区获取

Page 3: ORACLE 性能调整

SQL_Trace 实用工具SQL_Trace 有效则对每条语句有 :

• 解析、执行、取数据的计数;• CPU 时间和占用时间;• 物理读和逻辑读;• 处理行数目;• 所解析的用户名;• 每次提交和回滚的情况。

Page 4: ORACLE 性能调整

SQL_Trace 实用工具• 只在 SQL语句内启用 SQL_TRACE 使用 :

SQL>Alter session SQL_TRACE=TRUE;

• 在整个实例内启用 SQL_TRACE则需使用system:

SQL>ALTER system SET SQL_TRACE=TRUE;

注意:由于 SQL_TRACE实用程序会增加系统的开销,建议用完后及时设置为 FALSE。

Page 5: ORACLE 性能调整

EXPLAIN_PLAN 方法1.用 TKPROF生成解释计划select * from emp,dept where emp.deptno=dept.deptno;

2.用 EXPLAIN PLAN FOR生成解释计划创建 PLAN_TABLE 表以存放结果:在 UNIX 环境,运行 $ORACLE_HOME/rdbms/admin/utlxplan.sql ;在 NT 环境:运行 %ORACLE_HOME%\rdbms\admin\utlxplan.sql 。

SQL>@$ORACLE_HOME/rdbms/admin/utlxplan.sql ;

在 SQL 语句执行时用上 EXPLAIN PLAN FOR ,如:SQL> EXPLAIN PLAN FOR

select * from emp,dept

where emp.deptno=dept.deptno;

Page 6: ORACLE 性能调整

TKPROF 实用程序1. 跟踪文件将被输出到由服务器的初始化文件(或 spfile user_dump_d

est 参数指定的目录中。也可如下改变 : alter session set user_dump_dest="c:\kflosstrace";

alter session set tracefile_identifier ="kfloss_test"; 2. 建立跟踪 对模快 :SQL> exec dbms_monitor.serv_mod_act_trace_enable

(service_name=>'testenv', module_name=>'product_update'); 对客户机 :SQL> exec dbms_monitor.client_id_trace_enable

(client_id=>'kimberly');

Page 7: ORACLE 性能调整

TKPROF 实用程序SQL> select sid, serial#, username

from v$session;SID SERIAL# USERNAME------ ------- ------------133 4152 SYS137 2418 SYSMAN139 53 KIMBERLY140 561 DBSNMP141 4 DBSNMP. . .168 1169 1170 128 rows selected.

Page 8: ORACLE 性能调整

TKPROF 实用程序3. 分析跟踪结果

C:\...\udump> trcsess output="kfloss.trc" service="testenv" module="product update" action="batch insert"

对整合的跟踪文件运行 TKPROF ,以生成一份报告。 C:\...\udump> tkprof kfloss.trc

output=kfloss_trace_report SORT=(EXEELA, PRSELA, FCHELA)

Page 9: ORACLE 性能调整

用 dbv/RMAN 检查数据文件中的坏块

1. 使用 dbv 检查D:\oradata\eygle>dbv file=EYGLE.DBF blocksize=8192

2. 使用 RMAN 检查坏块 D:\oradata\eygle>rman target

SQL> select * from v$database_block_corruption; FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO ---------- ---------- ---------- ------------------ ---------

4 219 1 0 FRACTURED 4 1258 1 0 FRACTURED

Page 10: ORACLE 性能调整

磁盘读和缓冲区获取 在命令方式下用 SET autotrace on stat 来设置 磁盘读和缓冲区获取的自动统计

显示 SQL> set autotrace on stat;SQL> select * from dept; DEPTNO DNAME LOC---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTONStatistics---------------------------------------------------- 0 recursive calls

12 db block gets 6 consistent gets 0 physical reads 0 redo size 678 bytes sent via SQL*Net to client 424 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory)sorts (disk) 4 rows processed

Page 11: ORACLE 性能调整

索引、蔟与全表扫描• 索引好处 索引可以减少精确定位的访问次

数 .

• 索引代价 索引任何一个数据都要经过 log2

N 次访问 , 如果要索引到的数据太多那就不划算了 . 这是用全表扫描 .

Page 12: ORACLE 性能调整

如何避免全表扫描• 使用 AND 和 =, 千万不要使用 <> 这样的符号• 避免判定式崩溃 . 这是由判定约束而定的 .• 避免混合类型表达式 .

例如 charcol列为 VARCHAR2 类型的索引列 :AND charcol = <numexpr> 就会导致 charcol 类型转换 ,从而导致全表扫描 .

• 连接顺序很重要 .例如SELECT info FROM taba a, tabb b, tabc c

WHERE a.acol BETWEEN :alow AND :ahigh

AND b.bcol BETWEEN :blow AND :bhigh

AND c.ccol BETWEEN :clow AND :chigh

AND a.key1 = b.key1AND a.key2 = c.key2;

应该先选择再连接 .

Page 13: ORACLE 性能调整

如何避免全表扫描• 值访问就用值索引 ,函数访问就用函数索引 .

例如 :BETWEEN DECODE(:loval, ‘ALL’,somecolumn, :loval) AND DECODE(:hival, ‘ALL’, somecolumn, :hival) 就应该拆分 .

又如 , 如下使用 NYL() 是不对的 :

SELECT employee_num, full_name NAME,employee_id

FROM mtl_employees_current_view

WHERE (employee_num = NVL (:b1,employee_num)) AND (organization_id=:1) ORDER BY employee_num;

• (NOT)IN最好用 (NOT)EXIST 代替 .

Page 14: ORACLE 性能调整

视图的使用• 视图的本质是对某些表的萃取操作 .• 使用试图应谨慎

1.视图不可以插入数据 .

2.连接视图最好不用了 GROUP BY, 例如 :

CREATE VIEW dx(deptno, dname, totsal) AS

SELECT d.deptno, d.dname, e.sum(sal) FROM emp e, dept d

WHERE e.deptno = d.deptno GROUP BY deptno, dname ;

3. 用 NO_UNNEST 来禁止子查询嵌套操作 4.尽量不要使用视图的外连接

Page 15: ORACLE 性能调整

使用簇的原则簇是一组表的集合,这些表有一个共同的列,对表进行簇时需要注意下面的原则:1.对于应用程序连接语句中经常用在一起访问的表可以考虑创建簇;2.那些很少进行连接的表不要创建簇;3.如果应用程序经常对某个表进行全表扫描也不要创建簇;4.如果经常选择主表和子表,则要创建簇;5.如果表中具有相同的键值,但是这些键值占空间超过

1 个或2个数据块时,不宜创建簇;6.如果各个键值对应的行差异太大就不宜创建簇。

Page 16: ORACLE 性能调整

创建 Hash 簇的原则• 使用 hash 在数据量很多的时候会提高性能.但是如果数

据量少而访问又不频繁那就没必要了.• 是否创建哈希簇,主要考虑下面原则:1.对那些在使用中经常被访问的列,并且这些列经常使用等式的一组表可以创建哈希簇。2.对于非定的簇键,如果空间能容纳下将来所存放的所有行才能创建哈希簇。3.如果空间不足,不要考虑创建哈希簇。4.如果在应用经常采用全表扫描,则不要创建哈希簇。5.那些经常被修改聚合键值的表不宜创建哈希簇。

Page 17: ORACLE 性能调整

Hash 簇• 如果忽略了 HASH IS 子句, Oracle 就使用内部哈希函数来创建聚合 ,例如:

CREATE CLUSTER personnel

( department_number NUMBER )

SIZE 512 HASHKEYS 500

STORAGE (INITIAL 100K NEXT 50K);

Page 18: ORACLE 性能调整

使用优化器调整性能• 什么是优化器

Page 19: ORACLE 性能调整

什么是优化器• Oracle 的优化器( Optimizer)实际上是数据库环境的参

数设置。可以在 INITsid.ORA 文件内的 OPTIMZER_MODE=RULE 或 OPTIMZER_MODE=COST 或 OPTIMZER_MODE=CHOOSE 来设置优化目标。用户也可以在会话和查询方式下更改优化器的默认操作模式。

• OPTIMZER_MODE=RULE 激活基于规则的优化器 (RBO)

• OPTIMZER_MODE=COST 激活基于成本的优化器 (CBO)

• OPTIMZER_MODE=CHOOSE 在表被分析的情况下激活基于成本的优化器

Page 20: ORACLE 性能调整

SQL 处理体系结构

Page 21: ORACLE 性能调整

如何选择优化选择优化器主要是基 于应用的需要:• 对于批处理应用,如报表输出应用,需要采用吞吐量优化。因为吞吐量对于批处理来说更重要。

• 对于交互式应用,如 Oracle Forms 应用或 SQL*PLUS查询,需要采用最佳时间响应优化。因为交互式用户等着看到第一行的数据。

• 对于用 ROWNUM 来限制查询结果的查询,优化首先要考虑的响应时间。因为它要求的是得到最快的结果。

*.最大吞吐量优化类似于宁愿不要索引的全表扫描的结果或者相当于不要嵌套循环的分类合并连接。最佳响应时间的优化有点类似于索引扫描或嵌套循环连接。

Page 22: ORACLE 性能调整

决定优化器性能的因数• OPTIMIZER_MODE 初始参数

• 数据字典的统计数据

• ALTER SESSION 语句的 OPTIMIZER_GOAL 参数

• 在提示中改变目标

Page 23: ORACLE 性能调整

OPTIMIZER_MODE/ OPTIMIZER_GOAL

OPTIMIZER_MODE 初始参数或 ALTER SESSION语句的 OPTIMIZER_GOAL参数 取值如下:

• choose 表示优化器在基于代价和基于规则两种之间进行选择。如果数据字典有访问表的至少一行的统计数据,则优化器使用的基于代价和最佳吞吐量方法。如果访问表没有统计数据,则优化使用基于规则的路径。默认为基于规则的路径。

• All_rows 对整个 SQL 语句,优化器使用基于代价的路径。使用最小资源返回整个行。

• FIRST_ROWS 对整个 SQL 语句,优化器使用基于代价的路径。使用最小资源返回第一行。例如:

• RULE 对整个 SQL 语句,优化器使用基于规则的路径。

Page 24: ORACLE 性能调整

使用 dbms_stats包收集统计数据

options 参数• 使用 4 个预设的方法之一,这个选项能控制 Oracl

e 统计的刷新方式:• gather——重新分析整个架构( Schema)。 • gather empty——只分析目前还没有统计的表。 • gather stale——只重新分析修改量超过 10% 的

表(这些修改包括插入、更新和删除)。 • gather auto——重新分析当前没有统计的对象,

以及统计数据过期(变脏)的对象。

Page 25: ORACLE 性能调整

使用 dbms_stats包收集统计数据

estimate_percent选项以下 estimate_percent 参数是一种比较新的设计,它允许 O

racle 的 dbms_stats在收集统计数据时,自动估计要采样的一个 segment 的最佳百分比:estimate_percent => dbms_stats.auto_sample_size

method_opt选项dbms_stats 的method_opt参数尤其适合在

表和索引数据发生变化时刷新统计数据。

Page 26: ORACLE 性能调整

使用 dbms_stats包收集统计数据

例如:execdbms_stats.gather_schema_stats( own

name  => ‘SCOTT’, options => ‘GATHER AUTO’, estimate_percent =>dbms_stats.auto_sample_size, method_opt => ‘for all columns size  repeat', degree=> 15 )

Page 27: ORACLE 性能调整

Oracle 访问数据的基本方法 • 全表扫描

Oracle 是读表中相继的数据块。• 样本表扫描 1.在 select 语句后加 SAMPLE BLOCK 来对表进行部分的扫描查询。这种查询要求是只能对单表进行,不能在连接查询上使用样本扫描。也不能在远程进行样本扫描。 2.如果希望在远程上进行样本扫描的话,可以先用 CREATE TABLE AS SELECT 语句将远程表复制到本地,然后在使用 SAMPLE BLOCK 语句。

 例如:  select count(*)*100 from emp sample block(1)

Page 28: ORACLE 性能调整

CBO 访问路径 • 用 Rowid访问表

• 簇 (Cluster)扫描 所有具有相同簇键值的行都被存储进相同的数据库块中。为了执行簇扫描, Oracle首先通过扫描簇的索引,并从 中得到所选择的 rowid值,然后再基于该 rowid 对所有选择行进行定位。

Page 29: ORACLE 性能调整

RBO 访问路径 • 路径 1 :根据 rowid 访问行SELECT * from emp where rowid=’AAAA7BAA5AAA1UA

AA’;• 路径 2 :通过 cluster 联结访问行SELECT *  FROM emp, dept WHERE emp.deptno = d

ept.deptno  AND emp.empno = 7900;• 路径 3 :根据唯一性主键或主键的哈西簇访问单行select  a.table_name,a.index_name,a.uniqueness,b.c

olumn_name  from user_indexes a, user_ind_columns b  * where a.index_name=b.index_name and a.table_name='EMP'

• 路径 4 :根据唯一键或主键访问单行

Page 30: ORACLE 性能调整

RBO 访问路径• 路径 5 : cluster 连接• 路径 6 :哈西 cluster 键• 路径 7 :索引化 cluster 键• 路径 8 :复合索引• 路径 9 :单列索引• 路径 10 :索引化有界搜索• 路径 11 :索引化无界搜索• 路径 12 :合并排序联结• 路径 9 :单列索引• 路径 10 :索引化有界搜索• 路径 11 :索引化无界搜索• 路径 12 :合并排序联结

Page 31: ORACLE 性能调整

可优化的 SQL 语句 • 简单的 SQL 语句,即只设计单个表的 insert,update,selec

t • 简单的查询• 等式连接• 非等式连接• 外连接• 笛卡尔乘积• 复合语句• 组合查询• 访问视图• 分布式语句

Page 32: ORACLE 性能调整

SQL 语句优化的原理• 把 SQL 语句分成三步执行:取出语句、分

析拆解语句、执行语句,这就使得 SQL 能够达到纵向并行性.

• 把嵌套语句、合并连接语句分成:对于A中逐一个记录,都从 B 中进行查找,查找内容不一定要在B中结果返回以前就对A的下一条记录进行同样的任务.这就达到了横向的并行性.

Page 33: ORACLE 性能调整

提示的指定 • [ SELECT | DELETE|UPDATE ] /*+ [hint | text ] */ 或 [ SELECT |

DELETE|UPDATE ] --+ [hint | text ] 例如:

SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b)USE_NL (glcc glf) USE_MERGE (gp gsb) */b.application_id ,b.set_of_books_id ,b.personnel_id,p.vendor_id Personnel,p.segment1 PersonnelNumber,p.vendor_name NameFROM jl_br_journals j,jl_br_balances b,gl_code_combinations glcc,fnd_flex_values_vl glf,gl_periods gp,gl_sets_of_books gsb,po_vendors pWHERE . . . . . . . . . . . .

Page 34: ORACLE 性能调整

关于访问方法的提示 • FULL• ROWID例: SELECT /*+ROWID(emp)*/ * FROM empWHERE rowid>’AAAATKAABAAAFNTAAA’ AND empno=155

• CLUSTER• HASH• INDEX• INDEX_ASC• INDEX_COMBINE

Page 35: ORACLE 性能调整

关于访问方法的提示• INDEX_JOIN• INDEX_DESC• INDEX_FFS• NO_INDEX 禁止选择索引访问方法 • AND_EQUAL• USE_CONCAT 对 OR 条件进行转换 • NO_EXPAND  NO_EXPAND 对于具有 OR 或 IN 查询

语句,它将阻止基于开销的优化器对其进行 OR扩展。 • REWRITE• NOREWRITE

Page 36: ORACLE 性能调整

关于连接次序的提示 • /*+ORDERED*/

例: SELECT /*+ORDERED*/tab1.col1,tabl2.col2,tab3.col3  FROM tab1,tab2,tab3 WHERE  tab1.col1=tab2.col1 AND tab2.col1=tab3.col1

依 tab1,tab2,tab3 次序连接• STAR强行让优化器使用星型查询规划