查询sql效率问题方案记录
解决方案:sql内加入并行
/*+parallel(table_name, DOP)*/
select /*+parallel(t1,4)*/ * from t1;
排查记录:
1.使用sqlhc(数据库健康)脚本
使用方法
START sqlhc.sql T djkbyr8vkc64h
2.使用10053 trace跟踪
查看当前trace文件
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc'
AS "trace_file_name"
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_dump_dest') d;
启动事件,生成在trace目录下
(
如果sql语句已经解析过,执行计划已经缓存到数据库的共享池内,则需要使用下面的命令刷新一下共享池
SQL> alter system flush shared_pool;
#####不建议执行
)
SQL> ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';
执行sql
ALTER SESSION SET EVENTS '10053 trace name context off';
相关资料:
1. Predicate Move-Around (PM)(对SQL语句的谓词进行分析、重写,把它改为最符合逻辑的SQL语句)
2. 解释trace文件用到的一些缩写的指标定义
3. Peeked values of the binds in SQL statement(绑定变量的描述)
4. Bug Fix Control Environment(一些修复的bug信息)
5. PARAMETERS WITH DEFAULT VALUES(性能相关的初始化参数)
6. BASE STATISTICAL INFORMATION(SQL引用对象的基本信息)
7. CBO计算每个对象单独访问的代价
8. CBO计算列出两个表关联方式,并计算出每一种关联方式的代价,最终选择最小的cost
3.10046事件 ###10046 SQL(执行计划)运行地如何, 10053 优化器SQL选择某个执行计划的原因
SQL> alter session set events '10046 trace name context forever,level 12';
执行语句
alter session set events '10046 trace name context off';
SQL> select * from v$diag_info;
字段 Default Trace File
或
定位生成文件
select 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;
4.set autotrace on/off
查看执行计划
5.空闲块dba_tab_statistics
6.filesystemio_options
相关资料:
filesystemio_options 控制着操作系统io的设置。该参数只作用于文件系统。它有四个值可供设置,分别是:{none | setall | directIO | asynch }
I/O 说明
说明
在Synchronous I/O 的机制下,若一个Oracle进程想调用一个I/O请求,那么必须等待其他请求完成后才能调用。例如,如果它发起对几个数据块的读取,那么进程就必须等待它把所有数据块都读取到内存之后,才能进行下一个动作。
说明
在Asynchronous I/O 的机制下,进程可以与I/O请求同时工作。对已经读取的数据块,可以直接进行处理,不用等待所有数据块全部加载完毕再处理。
说明
在buffer I/O机制下,操作系统有自己的一套用于维护磁盘数据的cache,而不是直接从process buffer读取或者写入。其原理是从磁盘中读取数据写入cache,然后拷贝至process buffer。或者从process buffer中拷贝至cache然后写入到磁盘中。
说明
Direct I/O 能让所有的读和写的请求直接来自于磁盘,绕过操作系统缓存。
在ASM磁盘管理下,为了防止集群管理的数据库的数据损坏,必须直接使用Direct I/O。
对于使用文件系统的数据库环境,Oracle发出的读取请求可以从OS缓冲区中得到满足,而一旦启用direct I/O又不增加SGA大小,将导致磁盘读取需要更多的时间才能完成。为了充分利用direct I/O,需要将用于OS缓存部分增加到数据库SGA中。
7.oradebug
其他文章
8.sgastat查看共享池占用
SELECT name, bytes FROM v$sgastat WHERE pool='shared pool' order by 2;
9.收集统计信息
其他文章
10.查看对应的等待事件
col wait_class for a20
set lines 200 pages 200
col event for a60
select event,count(*),wait_class from v$session_wait group by event,wait_class order by 3;