explain plan for
+ SQL
select * from table(dbms_xplan.display());#分析结果放入plan_table
跟踪一个人都执行了哪些sql,首先开启跟踪,这个人执行的所有sql都被记录到trace file,但此文件是不可读的,通过TKPROF转换成可读文件
EXPLAIN与SQL*TRACE的不同点:
explain:单个sql,不执行
sql*trace:不是单个sql,执行后将生成trace文件
用法
set autotrace on
SQL
set autotrace off
开启autot后显示哪些内容
执行计划
过滤条件
统计信息
统计信息
consistent gets:逻辑读:从内存中访问的数据块数量
physical reads :物理读:从磁盘中访问的数据块数量
autotrace与explain的区别
autotrace:实际执行sql语句
explain:不执行sql语句
HASH JOIN 排序合并连接 嵌套循环连接
HASH JOIN 排序合并连接 :大大反大
嵌套循环连接:小大返小 ,前提是有索引
下图是HASH JOIN 但是
小表大表作连接,返回小结果集
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语句会被屏蔽掉
它是对sqltrace的补充
10046事件的等级
level1:相当于SQL*TRACE
使用方法
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;
执行hang分析
1:sid +serial
2:sql_id
3:pid
正常方式进不了sqlplus,用prelim进入到hang住的数据库
视图:index_stats
分析之后查出来的索引或表才是最准确的
分析表:analyze table xxx compute statistics;
分析索引:analyze index xxx validate structure;
alter index ind_shida1 rebuild;
nvl(id)
id+1=11
id varchar2(10) ->解决办法: id='10’可以走索引
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;
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.
面试题:表和索引谁大谁小
索引建的合理,索引表
索引建的不合理,产生索引碎片,高度》=4,索引可能>表
本地前缀分区索引:分区索引与表的分区数量一致,前缀指表分区用id分的,索引也得用id分
本地非前缀分区索引:分区索引与表的分区数量一致,非前缀指表分区用id分的,索引用别的字段分
全局分区索引:分区索引与表的分区数量可以不一致,要有maxvalue关键字
本地前缀分区索引:
create index XXX on table(id);
11g以下不可以在同一个字段上创建索引
全局分区索引:
分区数量可以与表的分区数量不一样
针对于分区表的查询语句
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';