JAVA面试题分享三百八十七:慢SQL处理方案

本文详细介绍了如何在数据库中获取执行时间长的SQL(慢SQL),包括从历史记录中筛选和查询,以及提供了一系列慢SQL处理方法,如应急清理执行计划、更新统计信息、添加索引和使用hint。日常处理强调了维护统计信息和优化执行计划的重要性。
摘要由CSDN通过智能技术生成

目录

获取慢SQL方式

慢SQL处理方法

1 慢sql应急处理方法

2 慢sql日常处理方法


获取慢SQL方式

--获取目前执行时间较长sql:

select datediff(ss, last_recv_time, sysdate) ss ,
         dbms_lob.substr(sf_get_session_sql(sess_id)), --抓取sql的全部内容
         curr_sch,
         sess_id,
         substr(clnt_ip, 8, instr(clnt_ip,':',8)-8)
    from v$sessions
   where state='ACTIVE' 
order by 1 desc;

--查询最近10000条SQL历史记录,并按照耗时倒序排列。

select * from v$sql_history order by time_used desc;

--查询,显示系统自启动以来执行时间最长的300条SQL语句。

SELECT * FROM V$SYSTEM_LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC;

--历史sql   EXEC_TIME 执行时间(MS)  MAX_MEM_USED 内存使用峰值(K)。

select SQL_TXT,EXEC_TIME,MAX_MEM_USED/1024 from  V$SQL_STAT_HISTORY order by 3 desc;

--目前sql。

select SQL_TXT,EXEC_TIME,MAX_MEM_USED/1024 from  V$SQL_STAT order by 3 desc;

--统计历史慢SQL执行情况:

 
select sql_text,
         COUNT(0) 执行次数,
         max(EXEC_TIME) 最大执行时间,
         TRUNC(avg(exec_time),2) 平均执行时间
    from v$long_exec_sqls a
group by sql_text
order by COUNT(0) desc,
         max(EXEC_TIME);

慢SQL处理方法

1 慢sql应急处理方法

--清理执行计划:

SP_CLEAR_PLAN_CACHE(plan_id);
plan_id:指定计划 ID,其值可以从动态视图 V$CACHEPLN 中的 CACHE_ITEM 列获
得。
select CACHE_ITEM, from SYS."V$CACHEPLN" where sqlstr like '%LEFT JOIN tss.QN_TELEPHONE_RECORD_TASK%';

--查杀执行时间超过 300s:

select datediff(ss, last_recv_time, sysdate) ss ,
        dbms_lob.substr(sf_get_session_sql(sess_id)), --抓取sql的全部内容
        'sp_close_session('||sess_id||');'
from v$sessions
where state='ACTIVE' and datediff(ss, last_recv_time, sysdate) >100;

2 慢sql日常处理方法

1)更新统计信息

分析表数据量与统计信息下的数据量差值是否较大,较大时需要重新收集统计信息:

select count(*) from SCHEMA.TABLENAME;--查询表的数据量
--统计信息查询
dbms_stats.table_stats_show('SCHEMA','TABLENAME');--查询表的数据量
dbms_stats.index_stats_show('SCHEMA','INDEXNAME');--查询索引的数据量
dbms_stats.column_stats_show('SCHEMA','TABLENAME','COLUMNNAME');--查询字段数据量

--更新表的统计信息
DBMS_STATS.GATHER_TABLE_STATS('SCHEMA','TABLENAME', NULL, 100, TRUE, 'FOR ALL COLUMNS SIZE AUTO');
--更新索引的统计信息
DBMS_STATS.GATHER_INDEX_STATS('SCHEMA',REC.INDEX_NAME,NULL,100);

--服务器使用脚本更新统计信息
/opt/dmdbms/jdk/bin/java -jar ./statcmd-1.0.4.jar 16 SCHEMA TABLENAME 0 SYSDBA/'密码'@IP:端口

注:更新统计信息尽量在中午或晚上执行,避免跟业务操作时间重合,影响业务使用。

2)添加索引

当查询sql比较慢,执行计划中显示走的全表扫描,可以针对条件字段添加索引或者组合索引。

--普通索引
CREATE  INDEX "IDXNAME" ON "'SCHEMA'"."TABLENAME"("'COLUMNNAME'" ASC) ONLINE;
--组合索引
CREATE  INDEX "IDXNAME" ON "'SCHEMA'"."TABLENAME"("'COLUMNNAME1'" ASC,"'COLUMNNAME2'" ASC) ONLINE;

3)添加hint

通过执行计划,发现部分表有索引但走的全表扫描,或者条件中有or之类的判断时,可以通过添加hint方式,改变sql的执行计划,优化执行效率。

常用的hint:

  • /*+INDEX(TABLENAME, IDX_NAME)*/--强制使用索引;

  • /*+ENABLE_HASH_JOIN(0)*/--禁用hash join关联;

  • /*+OPTIMIZER_OR_NBEXP(2)*/--条件中含有or时可以使用;

  • --/*+ENABLE_RQ_TO_NONREF_SPL(3)*/--执行计划中有SPL时使用。

4)绑定hint

实际生产中,部分慢SQL执行频率较高、业务短期内没有升级需求或者其他特殊情况,无法及时处理,可以通过模糊绑定hint方式,使sql强制走hint的执行计划。

--模糊绑定 部份SQL:

SF_INJECT_HINT('SQL_TEXT ','HINT_TEXT', 'add_optimize_or01', '', TRUE, NULL);
  • SQL_TEXT为需要添加hint的sql文本,必须跟查出来的慢SQL结构保持一致,且尽量保证不与其他sql相同。

  • HINT_TEXT是具体绑定的hint内容,如ENABLE_HASH_JOIN(0)。

  • add_optimize_or01是绑定的名称,类似主键ID。

--查询所有绑定的sql:

select * from SYSINJECTHINT;
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之乎者也·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值