SQL优化之注入HINT

一、说明

功能说明:为 SQL 注入 HINT 规则。SF_INJECT_HINT 方法创建的 HINT 规则无生效类别限制,如果需要为该 HINT 规则设置生效类别,可通过 SF_ALTER_HINT 过程修改实现。

参数说明:
sql_text:待注入 HINT 规则的 SQL 语句。SQL 语句必须是语法正确的增删改查语句。
hint_text:待注入的 HINT 规则,必须指定为非 NULL 值。
name:HINT 规则的名称,指定为 NULL 值时系统为其命名。
description:对 HINT 规则的详细描述。
validate:HINT 规则是否生效。TRUE 是;FALSE 否。
fuzzy:指定 SQL 的匹配规则为精准匹配或模糊匹配,该参数值不能为 NULL。
当该参数缺省时,表示使用定义 1 的语法,仅支持精准匹配。
该参数类型为 BOOLEAN 时,使用定义 2 或定义 3 的语法,值为 TRUE 时,为模糊匹配;
值为 FALSE 时,为精准匹配。
精准匹配时,待注入 HINT 规则的 SQL 语句必须为语法正确的 INSERT/DELETE/UPDATE/SELECT/MERGE INTO 语句(语句以 EXPLAIN/EXPLAIN FOR 开头时,去掉 EXPLAIN/EXPLAIN FOR 后的语句必须完全正确),精准匹配要求 SQL 语句完全匹配,不支持 SQL 语句中的子查询匹配;
模糊匹配时,待注入 HINT 规则的 SQL 语句应为非 NULL 值。
该参数类型为 INT 时,使用定义 4 或定义 5 的语法,值为 0 表示精确匹配,值为 1 表示模糊匹配,值为 2 表示通过 sql_text_id精确匹配。
fuzzy 取值为 2 时,参数 sql_text 应该输入长度为 13 的 sql_text_id 字段,如果 fuzzy 取值为 2 但参数 sql_text 依旧输入 SQL 语句,预期会报错。
need_clear:是否同步清空所有缓存的计划,该参数值不能为 NULL。
当该参数缺省时,表示使用定义 1、定义 2 或定义 4 的语法,此时默认不清空缓存计划。
指定该参数时,使用定义 3 和定义 5 的语法,值为 TRUE 时,清空缓存的计划;值为 FALSE 时,模糊匹配和通过 sql_text_id 匹配时,不清空缓存的计划,需要手动清除对应 SQL 的计划后,指定的 HINT 才能生效,精确匹配时,默认会删除受影响 SQL 的计划缓存。

返回值:执行成功返回名称,执行失败报错误信息。

二、使用

--模糊匹配
SF_INJECT_HINT('SQL语句', 'HINT', 'INJECT名称', '注释', TRUE, TRUE);

注入HINT后需要清空对应SQL的计划缓存

BEGIN
    FOR RS IN (SELECT * FROM V$CACHEPLN WHERE SQLSTR LIKE '%SQL语句%') LOOP
        EXECUTE IMMEDIATE 'SP_CLEAR_PLAN_CACHE(' || RS.CACHE_ITEM || ');';
    END LOOP;
END;

查询已经注入的HINT-系统视图

SELECT * FROM SYSINJECTHINT ORDER BY CRTDATE DESC;

删除注入的HINT

SF_DEINJECT_HINT('INJECT名称');
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇