达梦为 SQL 指定 HINT,在无需修改SQL语句的情况下,来保证SQL执行计划在不同硬件环境下相同,从而保证SQL语句在不同环境的执行效率。在达梦数据库中使用SF_INJECT_HINT系统函数来为SQL绑定HINT。
1、使用时有以下限制:
(1) INI 参数 ENABLE_INJECT_HINT 需设置为 1;
(2) SQL 只能是语法正确的增删改查语句;
(3) SQL 会经过系统格式化,格式化之后的SQL和指定的规则名称必须全局唯一;
(4) HINT 一指定,则全局生效;
(5) 系统检查SQL匹配时,必须是整条语句完全匹配,不能是语句中子查询匹配;
(6) 可通过 SYSINJECTHINT 视图查看已指定的 SQL 语句和对应的 HINT。
2、hint格式
格式1:
VARCHAR
SF_INJECT_HINT (
SQL_TEXT TEXT,
HINT_TEXT TEXT,
NAME VARCHAR(128),
DESCRIPTION VARCHAR(256),
VALIDATE BOOLEAN
)
或者
格式2:
VARCHAR
SF_INJECT_HINT (
SQL_TEXT TEXT,
HINT_TEXT TEXT,
NAME VARCHAR(128),
DESCRIPTION VARCHAR(256),
VALIDATE BOOLEAN,
FUZZY BOOLEAN
)
2.1功能说明:
对指定 SQL 增加 HINT。
2.2参数说明:
(1) SQL_TEXT:要指定 HINT 的 SQL 语句
(2) HINT_TEXT:要为 SQL 指定的 HINT
(3) NAME:可以指定名称,或者设为 NULL 让系统自动创建名称
(4) DESCRIPTION:对规则的详细描述,可为 NULL
(5) VALIDATA:规则是否生效,可为 NULL,则为默认值 TRUE
(6) FUZZY:SQL 的匹配规则为精准匹配或模糊匹配。值为 TRUE 或 NULL 时,模糊匹配;值为 FALSE 或缺省时,精准匹配
(7) 返回值:执行成功返回名称,执行失败报错误信息
2.3下面举例说明:
为以下语句指定 HINT 为 MMT_SIZE = 4 的精准匹配规则:
SF_INJECT_HINT(‘SELECT * FROM A;’, ‘MMT_SIZE(4)’, ‘TEST_INJECT’, ‘to testfunction of injecting hint’, TRUE);
或者
SF_INJECT_HINT(‘SELECT * FROM A;’, ‘MMT_SIZE(4)’, ‘TEST_INJECT’, ‘to testfunction of injecting hint’, TRUE, FALSE);
为以下语句指定 HINT 为 MMT_SIZE = 4 的模糊匹配规则:
SF_INJECT_HINT(‘SELECT * FROM A;’, ‘MMT_SIZE(4)’, ‘TEST_INJECT’, ‘to testfunction of injecting hint’, TRUE, TRUE);
或者:
SF_INJECT_HINT(‘SELECT * FROM A;’, ‘MMT_SIZE(4)’, ‘TEST_INJECT’, ‘to testfunction of injecting hint’, TRUE, NULL);
3、删除绑定hint
SF_DEINJECT_HINT
SF_DEINJECT_HINT
定义:
INT
SF_DEINJECT_HINT (NAME VARCHAR(128)
)
3.1功能说明:
对指定 SQL 撤回已增加的 HINT
3.2参数说明:
NAME: 要删除的规则名称
返回值:
执行成功返回 0,执行失败返回错误码
3.3举例说明:
为 SQL 撤回已指定的 HINT:
SF_DEINJECT_HINT(‘TEST_INJECT’);
4、修改已绑定HINT
4.1定义:
INT
SF_ALTER_HINT (NAME VARCHAR(128),
ATTRIBUTE_NAME VARCHAR(12),
ATTRIBUTE_VALUE VARCHAR(256)
)
4.2功能说明:
修改已指定 HINT 的规则属性
4.3参数说明:
(1) NAME:要修改的规则名称
(2) ATTRIBUTE_NAME:要修改的属性
(3) STATUS:规则是否生效,取值ENABLED/DISABLED
(4) NAME:规则名称
(5) DESCRIPTION:规则的详细描述
(6) ATTRIBUTE_VALUE:设置的属性值
(7) 返回值:执行成功返回 0,执行失败返回错误码
4.4举例说明:
让已指定的 HINT 的规则失效:
SF_ALTER_HINT(‘TEST_INJECT’, ‘STATUS’, ‘DISABLED’);
文章
阅读量
获赞