主页 > 手机  > 

达梦数据库针对慢SQL,收集统计信息清除执行计划缓存

达梦数据库针对慢SQL,收集统计信息清除执行计划缓存

前言:若遇到以下场景,大概率是SQL走错了执行计划:

1、一条SQL在页面上查询特别慢,但拿到数据库终端执行特别快 2、一条SQL在某种检索条件下查询特别慢,但拿到数据库终端执行特别快

此时,可以尝试按照下述步骤进行恢复:

目录

一、分析SQL语句中涉及到的物理表,依次收集统计信息

1、单表数据量小的表,可通过以下方式收集(针对表中所有字段收集,速度相对慢)

2、单表数据量大的表,可通过以下方式收集(针对表中单个字段收集,速度相对快)

 二、SQL语句涉及表的统计信息收集完毕后,清除当前SQL的执行计划缓存

1、查询指定SQL的所有执行计划缓存(一条SQL可能会有多条执行计划缓存,每个缓存都有一个唯一的cache_item值,逐一记录每个cache_item值)

2、根据第一步得到的所有cache_item,清除当前SQL所有的执行计划缓存


一、分析SQL语句中涉及到的物理表,依次收集统计信息 1、单表数据量小的表,可通过以下方式收集(针对表中所有字段收集,速度相对慢) -- 指定表收集全表字段统计信息 call DBMS_STATS.GATHER_TABLE_STATS('模式名', '物理表名称', NULL, 100, TRUE, 'FOR ALL COLUMNS SIZE AUTO', 64,'GLOBAL'); --示例: call DBMS_STATS.GATHER_TABLE_STATS('SYSTEM', 'ORDER_TEST', NULL, 100, TRUE, 'FOR ALL COLUMNS SIZE AUTO', 64,'GLOBAL'); 2、单表数据量大的表,可通过以下方式收集(针对表中单个字段收集,速度相对快) -- 指定字段收集统计信息 stat 100 on 物理表名(表字段名); --示例: stat 100 on ORDER_TEST(ID); stat 100 on ORDER_TEST(AMOUNT); stat 100 on ORDER_TEST(DELETE_FLAG); stat 100 on ORDER_TEST(ACCOUNTING_MONTH);  二、SQL语句涉及表的统计信息收集完毕后,清除当前SQL的执行计划缓存 1、查询指定SQL的所有执行计划缓存(一条SQL可能会有多条执行计划缓存,每个缓存都有一个唯一的cache_item值,逐一记录每个cache_item值) -- 模糊查询指定SQL的所有执行计划缓存,获取SQL对应的cache_item字段值 select cache_item, * from v$cachepln where sqlstr like '%你的SQL语句%'; --示例: select cache_item, * from v$cachepln where sqlstr like '%SELECT * FROM ORDER_TEST WHERE ACCOUNTING_MONTH = '2025-01'%'; 2、根据第一步得到的所有cache_item,清除当前SQL所有的执行计划缓存 -- 指定清空某条SQL的缓存(cache_item字段来源于 第一步) call SP_CLEAR_PLAN_CACHE(cache_item); 示例: call SP_CLEAR_PLAN_CACHE(281008439485408);

特别注意:SP_CLEAR_PLAN_CACHE存储过程执行时,若不传cache_item,则会清除当前模式下所有SQL的执行计划缓存,生产环境请谨慎操作。

标签:

达梦数据库针对慢SQL,收集统计信息清除执行计划缓存由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“达梦数据库针对慢SQL,收集统计信息清除执行计划缓存