2020-03-21-Oracle_性能优化

Category

  • 1.性能优化
      • 1.1性能优化的概念
        • 1.1.1为什么要优化![增量备份](https://img-blog.csdnimg.cn/20200321093829450.png)
        • 1.1.2优化什么
        • 1.1.3性能优化的误区
        • 1.1.4 28规则
      • 1.2诊断分析工具
        • 1.2.1EXPLAIN
          • 1.2.1.1EXPLAIN简介
          • 1.2.1.2EXPLAIN使用方法
        • 1.2.2SQL*TRACE和TKPROF
        • 1.2.3autotrace(最常用)
      • 1.3案例
        • 1.3.1案例一
        • 1.3.2案例二
        • 1.3.3案例三:比sql*trace强大的10046事件
        • 1.3.3案例四:hang分析
      • 1.4索引
        • 1.4.1索引简介
        • 1.4.2索引的高度
        • 1.4.3重建索引
        • 1.4.4索引的深度
        • 1.4.5索引的聚簇因子
        • 1.4.6索引未被使用的原因(※面试经常出)
        • 1.4.7复合索引
        • 1.4.8索引放到别的表空间
        • 1.4.9针对索引和跟踪的实验
        • 1.4.10scott用户无法开启追踪的解决办法
      • 1.5表分区
        • 1.5.1分区简介
        • 1.5.2创建分区表
        • 1.5.3分区索引
        • 1.5.4在线重定义

1.性能优化

1.1性能优化的概念

1.1.1为什么要优化2020-03-21-Oracle_性能优化_第1张图片

1.1.2优化什么

2020-03-21-Oracle_性能优化_第2张图片

2020-03-21-Oracle_性能优化_第3张图片

2020-03-21-Oracle_性能优化_第4张图片

2020-03-21-Oracle_性能优化_第5张图片

1.1.3性能优化的误区

2020-03-21-Oracle_性能优化_第6张图片
2020-03-21-Oracle_性能优化_第7张图片
2020-03-21-Oracle_性能优化_第8张图片

1.1.4 28规则

2020-03-21-Oracle_性能优化_第9张图片
2020-03-21-Oracle_性能优化_第10张图片
2020-03-21-Oracle_性能优化_第11张图片

1.2诊断分析工具

2020-03-21-Oracle_性能优化_第12张图片

1.2.1EXPLAIN

1.2.1.1EXPLAIN简介

2020-03-21-Oracle_性能优化_第13张图片

1.2.1.2EXPLAIN使用方法
explain plan for 
+ SQL

select * from table(dbms_xplan.display());#分析结果放入plan_table

遵循的原则:
最右最上最先执行
2020-03-21-Oracle_性能优化_第14张图片

1.2.2SQL*TRACE和TKPROF

2020-03-21-Oracle_性能优化_第15张图片
跟踪一个人都执行了哪些sql,首先开启跟踪,这个人执行的所有sql都被记录到trace file,但此文件是不可读的,通过TKPROF转换成可读文件

EXPLAIN与SQL*TRACE的不同点:
explain:单个sql,不执行
sql*trace:不是单个sql,执行后将生成trace文件

1.2.3autotrace(最常用)

2020-03-21-Oracle_性能优化_第16张图片
用法
set autotrace on
SQL
set autotrace off
2020-03-21-Oracle_性能优化_第17张图片

开启autot后显示哪些内容
执行计划
过滤条件
统计信息

统计信息
2020-03-21-Oracle_性能优化_第18张图片
consistent gets:逻辑读:从内存中访问的数据块数量
physical reads :物理读:从磁盘中访问的数据块数量

autotrace与explain的区别
autotrace:实际执行sql语句
explain:不执行sql语句

1.3案例

1.3.1案例一

2020-03-21-Oracle_性能优化_第19张图片
HASH JOIN 排序合并连接 嵌套循环连接
HASH JOIN 排序合并连接 :大大反大
嵌套循环连接:小大返小 ,前提是有索引

下图是HASH JOIN 但是
小表大表作连接,返回小结果集
2020-03-21-Oracle_性能优化_第20张图片

2020-03-21-Oracle_性能优化_第21张图片
2020-03-21-Oracle_性能优化_第22张图片
面试问题:
通过多少种方式查询语句的执行计划?

1.3.2案例二

对话级跟踪
2020-03-21-Oracle_性能优化_第23张图片

DBA跟踪别人

session1 普通用户
select userenv('sid') from dual; 1
select serial# from v$session where sid=1; 11
select spid from v$process where addr=(select paddr from v$session where sid=1); 6816


session2 dba
exec DBMS_SYSTEM.~(1,11,true); #开启跟踪,此时session1执行任何sql语句都会被跟踪


session1 普通用户
执行一系列SQL语句


session2 dba
exec DBMS_SYSTEM.~(1,11,false); #关闭后产生跟踪文件

tkprof转换trace文件为可读的txt文件
tkprof NUODA_ora_6816.trc 6816.txt
# tkprof filename newfilename sort=fchela sys=no
# sort=fchela 按照sql执行时间进行降序排序
# sys=no sys执行的屏蔽掉 维护数据库用的无参考性的sql语句会被屏蔽掉

1.3.3案例三:比sql*trace强大的10046事件

它是对sqltrace的补充
2020-03-21-Oracle_性能优化_第24张图片
10046事件的等级
level1:相当于SQL*TRACE
2020-03-21-Oracle_性能优化_第25张图片
使用方法
2020-03-21-Oracle_性能优化_第26张图片

SQL> alter session set events '10046 trace name context forever , ' ;    会话已更改。 --开启本会话的10046事件level 12
SQL> exec dbms_monitor.session_trace_enable(267,996,waits=>true,binds=>true);      
PL/SQL 过程已成功完成。       -- 开启其他会话的10046事件

SQL> alter session set events '10046 trace name context off' ;
会话已更改。 --关闭本会话的10046事件
SQL> exec dbms_monitor.session_trace_disable(267,996); 
PL/SQL 过程已成功完成。            -- 关闭其他会话的10046事件

tkprof的使用:
tkprof oldfilename newfilename sort=fchela

10046比SQL*TRACE多的 等待事件
2020-03-21-Oracle_性能优化_第27张图片

1.3.3案例四:hang分析

找到谁没提交事务导致系统挂起的那个人
2020-03-21-Oracle_性能优化_第28张图片
模拟hang分析:
oradebug hanganalyze 3;

在这里插入图片描述
在这里插入图片描述

执行hang分析
在这里插入图片描述
2020-03-21-Oracle_性能优化_第29张图片
1:sid +serial
2:sql_id
3:pid
2020-03-21-Oracle_性能优化_第30张图片
正常方式进不了sqlplus,用prelim进入到hang住的数据库
在这里插入图片描述

1.4索引

1.4.1索引简介

2020-03-21-Oracle_性能优化_第31张图片
2020-03-21-Oracle_性能优化_第32张图片
2020-03-21-Oracle_性能优化_第33张图片

1.4.2索引的高度

视图:index_stats

分析之后查出来的索引或表才是最准确的
分析表:analyze table xxx compute statistics;
分析索引:analyze index xxx validate structure;

2020-03-21-Oracle_性能优化_第34张图片
索引高度>=4,该索引需要重建

1.4.3重建索引

alter index ind_shida1 rebuild;

1.4.4索引的深度

深度=高度-1
2020-03-21-Oracle_性能优化_第35张图片

1.4.5索引的聚簇因子

2020-03-21-Oracle_性能优化_第36张图片
2020-03-21-Oracle_性能优化_第37张图片
聚簇因子
2020-03-21-Oracle_性能优化_第38张图片
聚簇因子和块数接近,说明聚簇因子比较有序

1.4.6索引未被使用的原因(※面试经常出)

2020-03-21-Oracle_性能优化_第39张图片
nvl(id)
id+1=11
id varchar2(10) ->解决办法: id='10’可以走索引

1.4.7复合索引

2020-03-21-Oracle_性能优化_第40张图片
在这里插入图片描述
在这里插入图片描述

1.4.8索引放到别的表空间

2020-03-21-Oracle_性能优化_第41张图片
2020-03-21-Oracle_性能优化_第42张图片
2020-03-21-Oracle_性能优化_第43张图片
2020-03-21-Oracle_性能优化_第44张图片

1.4.9针对索引和跟踪的实验

1.创建索引

2.把索引移动到其他表空间

3.创建索引前后查询效率对比

4.查看索引的高度,深度

5.创建组合索引,执行相关查询,是否能提高查询效率

模拟10046事件(dba去跟踪其他session):

SQL> alter session set events '10046 trace name context forever , ' ;    会话已更改。 --开启本会话的10046事件level 12
SQL> exec dbms_monitor.session_trace_enable(267,996,waits=>true,binds=>true);      
PL/SQL 过程已成功完成。       -- 开启其他会话的10046事件

SQL> alter session set events '10046 trace name context off' ;
会话已更改。 --关闭本会话的10046事件
SQL> exec dbms_monitor.session_trace_disable(267,996); 
PL/SQL 过程已成功完成。            -- 关闭其他会话的10046事件

tkprof的使用:
tkprof oldfilename newfilename sort=fchela

模拟hang分析:
oradebug hanganalyze 3

1.4.10scott用户无法开启追踪的解决办法

SQL> conn scott/scott;
想要打开autotrace的时候报错:
SQL> set timing on   
SQL> set autotrace traceonly
SP2-0618: Cannot find the Session Identifier.  Check PLUSTRACE role is enabled
SP2-0611: Error enabling STATISTICS report

解决办法:
SQL> conn / as sysdba;
Connected.
SQL> select * from dba_roles where role='PLUSTRACE';
no rows selected
该数据库中目前不存在该角色,需要创建:
SQL> @?/sqlplus/admin/plustrce.sql
将该角色赋予scott用户:
SQL> grant plustrace to scott;
Grant succeeded.

1.5表分区

1.5.1分区简介

2020-03-21-Oracle_性能优化_第45张图片
面试问题:表里的数据能不能跨表空间?
可以,分区表

2020-03-21-Oracle_性能优化_第46张图片
面试题:表和索引谁大谁小
索引建的合理,索引表
索引建的不合理,产生索引碎片,高度》=4,索引可能>表

1.5.2创建分区表

2020-03-21-Oracle_性能优化_第47张图片

在这里插入图片描述

2020-03-21-Oracle_性能优化_第48张图片在这里插入图片描述
在这里插入图片描述
原来有max value,加分区是不允许的,要进行分裂
在这里插入图片描述

1.5.3分区索引

本地前缀分区索引:分区索引与表的分区数量一致,前缀指表分区用id分的,索引也得用id分
本地非前缀分区索引:分区索引与表的分区数量一致,非前缀指表分区用id分的,索引用别的字段分
全局分区索引:分区索引与表的分区数量可以不一致,要有maxvalue关键字

本地前缀分区索引:
2020-03-21-Oracle_性能优化_第49张图片
create index XXX on table(id);
11g以下不可以在同一个字段上创建索引

全局分区索引:
分区数量可以与表的分区数量不一样
2020-03-21-Oracle_性能优化_第50张图片
针对于分区表的查询语句

select table_name,partition_name,high_value,tablespace_name from user_tab_partitions where table_name='MYTEST' order by partition_position;

查询分区索引的状态

select a.table_name,a.partitioning_type,a.index_name,b.high_value,status
from user_part_indexes a
left join user_ind_partitions b
on a.index_name = b.index_name
where a.table_name = 'MYTEST';    

重建分区索引
2020-03-21-Oracle_性能优化_第51张图片

1.5.4在线重定义

将普通表变成分区表
2020-03-21-Oracle_性能优化_第52张图片
2020-03-21-Oracle_性能优化_第53张图片
2020-03-21-Oracle_性能优化_第54张图片
2020-03-21-Oracle_性能优化_第55张图片
在这里插入图片描述
2020-03-21-Oracle_性能优化_第56张图片
2020-03-21-Oracle_性能优化_第57张图片

2020-03-21-Oracle_性能优化_第58张图片
2020-03-21-Oracle_性能优化_第59张图片
BEGIN END 可以转写成exec
2020-03-21-Oracle_性能优化_第60张图片
在这里插入图片描述

你可能感兴趣的:(oracle,#,oracle_note)