在生产系统中,客户反映某个业务功能查询突然变慢,经过数据库慢SQL日志和应用WEB系统综合分析,发现是其中一条SQL语句执行时间变长,原来执行时间是2秒内,现在执行时间是5分钟左右,严重影响客户使用体验。业务方面没有增加新功能,数据库方面没有变更。检查该SQL语句执行计划,在数据库中该SQL语句存在两个执行计划。SQL语句走了不正确的执行计划,导致执行时间变长。
SQL语句执行时间突然变长的情况,可能由以下原因导致:
(1)表数据统计信息不准确,如数据库表批量写入了大量数据后没有及时更新统计信息。
(2)索引无效或没有走正确的索引,如以时间字段创建的分区表,没有走分区字段。
(3)业务增加新功能后,没有进行相应的SQL优化。如业务功能中增加了关联表,新表没有创建合适的索引。
该如何清理SQL语句的执行计划缓存,以下方法可供参考。
select *
from ( select SESS_id ,
sql_text ,
datediff(SS, last_recv_time, sysdate) SQL执行时间,
sf_get_session_sql(SESS_id) FULLSQL
from v$sessions
where state='ACTIVE' )
where SQL执行时间>2
order by SQL执行时间 DESC;
可以知道正在数据库执行的SQL语句,时间是秒。
select * from SYS."V$LONG_EXEC_SQLS" where exec_time>2000 and sess_id='140310373996480';
通过sess_id值在V$LONG_EXEC_SQLS视图中找到语句执行的详细信息,只有执行成功的语句才会写入到V$LONG_EXEC_SQLS视图中,v$sessions视图中执行中或执行失败的语句不会写入到V$LONG_EXEC_SQLS视图中。
SELECT *FROM V$SQL_PLAN WHERE SQL_ID=3298;
--hash_value=1386570604
将V$LONG_EXEC_SQLS视图中查询到的SQL_ID值代入到V$SQL_PLAN中,可以查到该语句的SQL执行计划。
SELECT *FROM V$CACHEPLN WHERE hash_value='1386570604';
将V$SQL_PLAN视图中查询到的hash_value值代入到V$CACHEPLN中,可以查询到该SQL语句的CACHE_ITEM(即CACHE的地址)。
命令:sp_clear_plan_cache(CACHE_ITEM);
sp_clear_plan_cache(140316170430592);
(1)sp_clear_plan_cache(CACHE_ITEM);可以清除指定SQL语句的计划缓存。
(2)sp_clear_plan_cache();可以清除数据库的所有SQL语句的执行计划。在生产系统,该命令禁止使用。
文章
阅读量
获赞