【引言】:在Oracle数据库的江湖中,执行计划如同武林高手的内功心法,一旦走火入魔,任你绝世神兵在手也难以施展。今日传授四招成名已久的清理绝技,助你破除旧执行计划的桎梏,让新的执行计划如蛟龙出海!
第一式:七伤拳·风云变
拳法精髓 :“拳动风云变,未伤人先伤己”
SQL> alter system flush shared_pool; System altered.
复制
– 功法原理 –
此招如狂风扫落叶,瞬间清空共享池中所有缓存的执行计划和SQL语句。虽能立竿见影让新计划登场,却会引发全库SQL重解析的"内力反噬",轻则性能抖动,重则应用震荡。
– 注意事项 –
月圆之夜(业务高峰期)慎用,出招前需焚香沐浴(做好业务评估),生产环境慎用!
第二式:大力金刚拳·碎甲断脉
拳法精髓 :“金刚伏魔,刚猛无俦,碎甲于无形”
对sql语句中相关的对象做个ddl操作(如添加注释、重建索引、授权等),如添加注释,也属于ddl语句,对生产库影响微乎其微:
SQL> comment on table t1 is 'test table'; Comment created.
复制
– 功法原理 –
以金刚劲力直击目标对象(重建索引/授权/加字段),旧执行计划如遭般若掌重击,瞬间分崩离析。新SQL出招时自会催生全新计划,即便轻如鸿毛的招式(如加注释)亦能碎甲破防。
– 注意事项 –
金刚劲刚猛霸道,可能触发"锁字诀"(DDL锁),需择吉时(维护窗口)出招。
第三式:化骨绵掌·暗劲摧心
掌法精髓 :“绵劲透经脉,旧计化尘烟”
重新收集表的统计时,加 no_invalidate => false 参数:
SQL> exec dbms_stats.gather_table_stats('SZR','T1',cascade=>true, no_invalidate=>FALSE, degree => 4); PL/SQL procedure successfully completed.
复制
– 功法原理 –
收集统计信息时暗藏no_invalidate真气,如绵掌暗劲般逐步瓦解旧执行计划的经脉,新计划趁势夺舍重生。看似风轻云淡,实则暗藏杀机,整个过程行云流水无痛切换。
– 注意事项 –
化骨需择吉时,选择业务低峰时段,避免影响正常操作。
第四式:六脉神剑·指哪打哪
指法精髓 :“剑气锁游标,弹指灭旧计”
使用dbms_shared_pool.purge 包对sql执行cursor刷出。
SQL> select address,hash_value,executions,parse_calls from v$sql where sql_TEXT like 'select * from t1%'; ADDRESS HASH_VALUE EXECUTIONS PARSE_CALLS ---------------- ---------- ---------- ----------- 0000000062AA5E80 2245880055 1 1 SQL> exec dbms_shared_pool.purge('0000000062AA5E80,2245880055','C'); PL/SQL procedure successfully completed. SQL> select address,hash_value,executions,parse_calls from v$sql where sql_TEXT like 'select * from t1%'; no rows selected
复制
– 功法原理 –
以v$sql探得SQL_ID为剑诀,用dbms_shared_pool神器直取特定游标性命。如段誉初学六脉神剑,精妙时例无虚发,生疏时施展不出(建议先练靶场)。
– 注意事项 –
需配合v$sql获取address秘钥,避免误伤,误输address/hash_value可能误伤友军(其他SQL游标)。
终章:武学总纲
招式 | 适用场景 | 杀伤范围 | 风险等级 |
---|---|---|---|
七伤拳 | 紧急清场/测试环境 | 全库无差别 | ★★★★★ |
大力金刚拳 | 精准破除单表旧计 | 对象级 | ★★☆☆☆ |
化骨绵掌 | 统计更新时无缝切换 | 渐进式 | ★★☆☆☆ |
六脉神剑 | 精确打击高危SQL | 游标级 | ★☆☆☆☆ |
心法要诀
- 七伤拳刚猛无匹,非生死关头不可轻用
- 大力金刚拳破甲需借天时(低业务/维护窗口)
- 化骨绵掌贵在无声,乃日常调理功法
- 六脉神剑以巧破力,唯手熟者方可驾驭
江湖路远,诸君当因时择术,慎用神功!
评论
