一 问题现象linux 服务器cpu使用率接近100% 使用vmstat 1 10查看id项接近1 top查看有好几个oracle进程排在前面 使用如下语句查看使用cpu高的sql占用cpu总时间排序 select * from (select s.sid,s.serial#,s.username,s.program,t.sql_id,t.cpu_time/1000000 as sum_cpu_time_seconds,t.executions,t.sql_text from v$session s,v$sql_text where s.sql_id=t.sql_id and s.status='ACTIVE' order by sum_cpu_time_seconds desc) where rownum<=10 平均cpu执行时间前10条sql select * from (select s.sid,s.serial#,s.username,s.program,t.sql_id,t.cpu_time/1000000/t.executions as per_cpu_time_seconds,t.executions,t.sql_text from v$session s,v$sql_text where s.sql_id=t.sql_id and s.status='ACTIVE' order by per_cpu_time_second desc) where rownum<=10 发现很多sid,serial$指向通一个sql,反复执行上面查询,executions增长很快,sum_cpu_time_seconds也增长很快 确认top中的pid对应的(sid,serial#)select p.spid,s.sid,s.serial#,s.username,s.osuer from v$session s,v$process pwhere s.paddr=p.add and p.spid in ('','','') ; 查看sql执行计划
select * from table(dbms_xplan.display_cursor('&SQL_ID',&child_number)); select * from table(dbms_xplan.display_awr('******'));
查看表的统计信息
select t.OWNER, t.TABLE_NAME, t.NUM_ROWS, t.LAST_ANALYZED, t.PARTITIONED
from dba_tables t where t.TABLE_NAME in ('a','b', 'c')
如果上次收集统计信息时间在1周以前,或者num_rows和当前表中记录数差距较大,应对该表新收集统计信息: 索引的统计信息 select owner,table_name,index_name,last_analyzed from dba_indexes where table_name ='&table_name'; 表记录数 select count(PK) from TAB; 表的属性/是否为分区表:
收集表的统计信息
查看表上的索引信息
1 确认该表上的索引状态正常:SELECT OWNER,INDEX_NAME FROM dba_indexes WHERE status<>'VALID' AND partitioned <> 'YES' UNION ALLSELECT INDEX_OWNER,INDEX_NAME FROM dba_ind_partitions WHERE status<>'USABLE' UNION ALLSELECT INDEX_OWNER,INDEX_NAME FROM dba_ind_subpartitions WHERE status<>'USABLE'不应该返回记录,或返回索引和查询表无关
确认表上有合适的索引可以被利用:sysdba用户执行:set lines 132col column_name for a40col index_name for a30select index_name,column_name,COLUMN_POSITION , INDEX_OWNERfrom dba_ind_columns where table_name ='&table_name'order by 1,3 asc; select index_name,index_type,table_name,uniqueness,status,num_rows from dba_indexes where owner='SCOTT' and table_name='EMP1' 根据sql_id查看历史执行计划 SELECT sql_id,plan_hash_value, SUM(elapsed_time_total)/SUM(executions_total)/1000000 avg_elapsedt_secs FROM dba_hist_sqlstat WHERE sql_id = 'brk7h8vn51wm2' GROUP BY sql_id,plan_hash_value ; 数据分布情况: set line 120 col OWNER for a10 col COLUMN_NAME for a18 select OWNER,TABLE_NAME,COLUMN_NAME,NUM_DISTINCT,NUM_NULLS from dba_tab_columns where TABLE_NAME='&table_name'; NUM_DISTINCT任意列不同值的数量 dba_tables 的num_rows可以得到某个表的行数 列的可选择性分析: SELECT COUNT(*) from BRAS.TJ_ZJJY_5; SELECT COUNT(distinct entry_id) from BRAS.TJ_ZJJY_5; SELECT COUNT(distinct ishandle) from BRAS.TJ_ZJJY_5; SELECT COUNT(distinct bankcode) from BRAS.TJ_ZJJY_5; --索引定义语句set pagesize 0set long 90000set feedback offset echo offselect dbms_metadata.get_ddl('INDEX','PK_LD_CAR_MONITOR','LOGISTICS') from dual; 索引建立原则: 主要索引:一般索引,唯一性索引,组合索引, 组合索引:应用最广泛,使用时候选择性最高(唯一值)放在最前面 建立索引考虑事项:结果集,数据量很大,但结果集很小 检查where查询中限定性比较强的条件 表连接方式:hash连接(数据量大的表之间) NL (循环遍历),适合结果集很小,在第一个表中查询的结果少 ---在dept1上创建unique索引 create unique index pk_dept1_index on dept1(deptno); 删除索引 drop index EMP_EMPNO_IDX; ---索引创建示例: 在表TJ10,TJ30.T100 组合索引 create index TJ_ZJJY_ZH_INX_1 on TJ10(entry_id, ishandle, bankcode); create index TJ_ZJJY_ZH_INX_2 on TJ30(entry_id, ishandle, bankcode); create index TJ_ZJJY_ZH_INX_3 on TJ100(entry_id, ishandle, bankcode); create index TJ_ZJJY_ZH_INX_4 on TJ1102(entry_id, ishandle, bankcode); create index ET_BU_IDX on ET_BUSIFORM_TB(NODE_NO,FORM_TYPE,ACTIVE_FLAG,1) invisible; count(*) 需要计算总行,索引不记录空行,需要一定的技巧 show parameter invisible 确定参数为false create index ET_BU_IDX on ET_BUSIFORM_TB(NODE_NO,FORM_TYPE,ACTIVE_FLAG,1) invisible; (可以建立node_no,from_type,active_flag,1)这样的索引 create index on (node_no,from_type,active_flag,1) 确定需要建立索引的列 1 主键约束,除开主键列的其他列的唯一性约束,都会创建一个索引 2 外键需要手工建立索引 3 适合创建索引的列 where后的列,组合索引,select子句中的列,group by,order by union distinct子句中使用的列 注:优化器忽略索引的原因: 使用不等条件 <> 使用通配符 ‘%lapti’,而使用通配符apti%可以走index range scan 空值:唯一索引的所有列都是null值,这些列不会包含在索引中,即使有唯一索引 查询中包含函数
编辑推荐:
- Oracle数据恢复—人为误删除Oracle数据库数据怎么恢复?03-03
- oracle cpu使用率接近100%排查思路03-03
- [20240821]建立完善kglob.sql脚本.txt03-03
- [20240822]e8ec445edab00042802d511305ab90fa full_hash_value.txt03-03
- [20240823]SYS.1073777561是什么对象.txt03-03
- 数据库管理-第235期 为什么RAC架构仍然很强(20240827)03-03
- [20240823]21c数字对象是什么.txt03-03
- [20240824]跟踪library cache lock library cache pin使用gdb.txt03-03
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 数据库管理-第235期 为什么RAC架构仍然很强(20240827)
数据库管理-第235期 为什么RAC架构仍然很强(20240827)
26-03-03 - rac集群二几点重启ora.gipcd不能正常启动
rac集群二几点重启ora.gipcd不能正常启动
26-03-03 - ORA-00600: 内部错误代码, 参数: [13011]处理
ORA-00600: 内部错误代码, 参数: [13011]处理
26-03-03 - 超过100万行 存储过程的超复杂Oracle数据库,国产化怎么办?
超过100万行 存储过程的超复杂Oracle数据库,国产化怎么办?
26-03-03 - 4家国产数据库上市公司半年报!最好的利润1个亿!最差的亏8000万!
4家国产数据库上市公司半年报!最好的利润1个亿!最差的亏8000万!
26-03-03 - PORCESS满 故障处理报告
PORCESS满 故障处理报告
26-03-03 - 无缝连接!YashanDB DBLink技术应用实践
无缝连接!YashanDB DBLink技术应用实践
26-03-03 - Oracle 数据库忘记密码,如何找回明文密码?
Oracle 数据库忘记密码,如何找回明文密码?
26-03-03 - Oracle 丢失Redo、Control、SYSAUX、USER文件,无备份,成功启库!
- 阿里财报透视:谁在投入?谁在收缩?
阿里财报透视:谁在投入?谁在收缩?
26-03-03
