风中有朵雨做的云电影网站,卖酒的网站做线下怎么做,网站推广页面设计,做网站目的一、 区别
1、 hint注入
Hint注入是通过系统函数为SQL语句动态添加优化器指令的技术。通过SQL注释语法#xff08;/ ... /#xff09;向优化器传递指令#xff0c;干预其生成执行计划的决策过程#xff08;如强制索引、连接顺序#xff09;。通过系统函数 sf_inject_hin…一、 区别1、 hint注入Hint注入是通过系统函数为SQL语句动态添加优化器指令的技术。通过SQL注释语法/ ... /向优化器传递指令干预其生成执行计划的决策过程如强制索引、连接顺序。通过系统函数 sf_inject_hint 创建全局规则将HINT指令与特定SQL绑定无需修改原SQL文本即可干预优化器行为。规则存储在系统视图 SYSINJECTHINT 中由数据库自动匹配应用。通过参数ENABLE_INJECT_HINT1全局开启Hint注入。 核心特点无需修改SQL文本。DDL变更导致失效表结构变更如删除索引后强制索引的HINT会报错。修改规则后SQL仍使用旧执行计划需手动清理计划缓存。支持按SQL文本绑定和按HASH_VALUE绑定。2、持久化绑定计划持久化绑定计划指将已生成的执行计划持久化存储至系统表SYSPLNINFO中确保数据库重启后仍可加载使用从而避免执行计划因环境变化如迁移、升级而失效保障性能稳定性。数据库重启后通过参数LOAD_BINDED_PLN1自动加载确保计划跨会话、跨重启的稳定性。 核心特点固化现有计划跳过优化器阶段直接复用存储的计划避免因统计信息更新、索引变更等导致执行计划变动。持久化存储计划存入系统表不受重启影响。表结构变更如删列、改类型会导致绑定计划自动失效。支持按SQL文本绑定和按HASH_VALUE绑定。分为内存绑定与持久化绑定绑定状态标识在动态视图 V$CACHEPLN 中通过 BINDED 字段区分绑定类型N未绑定 M内存绑定重启失效 P持久化绑定 B内存绑定与持久化绑定同时生效。二、适用场景1、hint注入紧急性能问题修复当关键SQL因优化器缺陷如错误选择索引或连接方式导致性能骤降时通过Hint注入强制指定执行路径。无需重启应用或修改SQL文本实时生效。规避全局参数风险需调整优化器参数如OPTIMIZER_OR_NBEXP但全局修改会影响其他业务SQL。会话级或SQL级精准控制避免全局参数副作用。解决统计信息失真问题统计信息未及时更新或采样率不足导致计划劣化如全表扫描替代索引扫描。2、持久化绑定计划核心交易系统性能保障高频交易类SQL如支付、清算需绝对稳定的执行计划避免因统计信息更新、索引变更等导致计划突变引发性能抖动。计划存入系统表 SYSPLNINFO重启后通过 LOAD_BINDED_PLN1 自动加载彻底规避计划漂移风险。统计信息采集不及时或采样率不足时优化器可能生成劣质计划如全表扫描替代索引扫描。在统计信息准确时绑定最优计划后续统计信息更新不会触发计划重生成。数据库迁移/升级场景跨版本升级或异构迁移如Oracle→达梦时需保持原执行计划一致性避免因优化器差异导致性能回退。三、操作步骤准备测试环境创建测试表create table DMHR.TAB01 ( ID INT not null , NAME VARCHAR2(10), ADDRESS VARCHAR2(10), primary key(ID) );创建测试数据insert into DMHR.TAB01 values(1,Tony,Beijing); insert into DMHR.TAB01 values(2,Jason,USA); insert into DMHR.TAB01 values(3,Tracy,JP); commit;检查默认的执行计划select * from DMHR.TAB01 t where t.ID1; 1 #NSET2: [1, 1, 112] 2 #PRJT2: [1, 1, 112]; exp_num(4), is_atom(FALSE) 3 #BLKUP2: [1, 1, 112]; INDEX33555511(T) 4 #SSEK2: [1, 1, 112]; scan_type(ASC), INDEX33555511(TAB01 as T), scan_range[1,1], is_global(0)强制不走索引select /* NO_INDEX(t INDEX33555511) */ * from DMHR.TAB01 t where t.ID1; 1 #NSET2: [1, 1, 112] 2 #PRJT2: [1, 1, 112]; exp_num(4), is_atom(FALSE) 3 #SLCT2: [1, 1, 112]; T.ID 1 SLCT_PUSHDOWN(TRUE) 4 #CSCN2: [1, 3, 112]; INDEX33555510(TAB01 as T) NEED_SLCT(TRUE); btr_scan(1)1、hint注入1根据sql模糊匹配可通过SYSINJECTHINT 视图查看已指定的SQL 语句和对应的HINT。 select * from SYSINJECTHINT ; 如需修改注入的sql信息可先删除INJECT再重新创建例 SF_DEINJECT_HINT 函数可以将设置INJECT hint删除。 sf_deinject_hint(TESTJOIN,false); 添加INJECT语法 sf_inject_hint( sql_text select * from v$sessions a ,v$session_stat b where a.sess_idb.sessid;, hint_text use_nl(a,b), name TESTJOIN, description this is a test join hint., validate true, fuzzy true, --模糊匹配 need_clearfalse --不清空全库执行计划 ); 0 测试案例 通过参数ENABLE_INJECT_HINT1全局开启Hint注入 sp_set_para_value(1,ENABLE_INJECT_HINT,1) sf_inject_hint( sql_text select * from DMHR.TAB01 t where t.ID1;, hint_text NO_INDEX(t INDEX33555511) , name TESTJOIN, description this is a test join hint., validate true, fuzzy true, --模糊匹配 need_clearfalse --不清空全库执行计划 ); 检查新产生的注入 select * from SYSINJECTHINT; TESTJOIN this is a test join hint. TRUE 长文本 长文本 SYSDBA 2025-12-26 12:45:38.373365 1 NULL NULL 检查SQL 产生的执行计划 select * from DMHR.TAB01 t where t.ID1; 一定要完全和绑定是的SQL。 1 #NSET2: [1, 1, 112] 2 #PRJT2: [1, 1, 112]; exp_num(4), is_atom(FALSE) 3 #SLCT2: [1, 1, 112]; T.ID 1 SLCT_PUSHDOWN(TRUE) 4 #CSCN2: [1, 3, 112]; INDEX33555510(TAB01 as T) NEED_SLCT(TRUE); btr_scan(1) 检查是否命中了hint select * from V$INJECT_HINT_INFO; 1836374296 select * from DMHR.TAB01 t where t.ID1; TESTJOIN NO_INDEX(t INDEX33555511) 2025-12-26 12:47:56 2025-12-26 12:47:56 1 Y TRUE2根据sql_text_id 绑定--查询sql_text_id SELECT SQL_TEXT_ID,SQL_TEXT FROM SYS.V$SQLTEXT WHERE SQL_TEXT LIKE select * from DMHR.TAB01 t where t.ID1;; sn5u4cg7brg5h select * from DMHR.TAB01 t where t.ID1; --清除之前的HINT 注入 SF_DEINJECT_HINT(TESTJOIN); --确认之前的HINT 被清除 select * from SYSINJECTHINT; --使用sql_text_id进行hint注入 SF_INJECT_HINT(sn5u4cg7brg5h,NO_INDEX(t INDEX33555511),TESTJOIN01,,TRUE,2); --sql_text待注入 HINT 规则的 SQL 语句。fuzzy 参数类型为 INT 时值为 2 表示支持通过 sql_text_id 指定待注入的 SQL 语句sql_text_id 字段可通过 V$SQLTEXT 视图进行查询 --validateHINT 规则是否生效。TRUE 是FALSE 否 确认新HINT 的注入 select * from SYSINJECTHINT; 检查SQL 的执行计划 select * from DMHR.TAB01 t where t.ID1; 1 #NSET2: [1, 1, 112] 2 #PRJT2: [1, 1, 112]; exp_num(4), is_atom(FALSE) 3 #SLCT2: [1, 1, 112]; T.ID 1 SLCT_PUSHDOWN(TRUE) 4 #CSCN2: [1, 3, 112]; INDEX33555510(TAB01 as T) NEED_SLCT(TRUE); btr_scan(1) 检查HINT 的命中情况 select * from V$INJECT_HINT_INFO;2、持久化绑定计划1清空执行计划缓存sp_clear_plan_cache(); 删除上面的HINT 注入 SF_DEINJECT_HINT(TESTJOIN01);2执行SQL 生成新的待绑定的执行计划注意需要实际执行select /* NO_INDEX(t INDEX33555511) */ * from DMHR.TAB01 t where t.ID1; 1 #NSET2: [1, 1, 112] 2 #PRJT2: [1, 1, 112]; exp_num(4), is_atom(FALSE) 3 #SLCT2: [1, 1, 112]; T.ID 1 SLCT_PUSHDOWN(TRUE) 4 #CSCN2: [1, 3, 112]; INDEX33555510(TAB01 as T) NEED_SLCT(TRUE); btr_scan(1)3持久化绑定获取模式的 ID SELECT SCHID FROM SYSOBJECTS WHERE NAMESYSDBA AND TYPE$SCH 0 获取SQL 的HASH_VALUE SELECT HASH_VALUE FROM V$CACHEPLN WHERE SQLSTR LIKE select /* NO_INDEX(t INDEX33555511) */ * from DMHR.TAB01 t where t.ID1;; SELECT HASH_VALUE FROM SYS.V$SQLTEXT WHERE SQL_TEXT LIKE select /* NO_INDEX(t INDEX33555511) */ * from DMHR.TAB01 t where t.ID1;; -1226422453 SP_SET_PLN_BINDED(-1226422453,SYSDBA, SQL, 2); 说明 SP_SET_PLN_BINDED( sql_text VARCHAR(32767), -- SQL语句文本需完整匹配或 SQL哈希值从 V$CACHEPLN.HASH_VALUE或V$SQLTEXT.HASH_VALUE 获取 schid INTEGER, -- 模式ID可通过 SELECT SCHID FROM SYSOBJECTS WHERE NAME模式名 AND TYPE$SCH 获取 type VARCHAR(12), -- 语句类型SQL查询语句或 PL/OBJ存储过程/触发器 binded INTEGER -- 绑定类型0解绑、1内存绑定、2持久化绑定 );4查询系统中绑定执行计划持久化的信息。select * from SYSPLNINFO; 1 -1226422453 150994945 7 select /* NO_INDEX(t INDEX33555511) */ * from DMHR.TAB01 t where t.ID1; 二进制 11 1 N --查询系统中绑定执行计划对应字典对象的信息。 select * from SYSPLNOBJID; 1 150995946 1 1036 1 33555510 --针对sql查询是否已添加持久化绑定 select * from v$cachepln where HASH_VALUE-1226422453;5移除和禁用移除系统表 SYSPLNINFO 中 PLN_ID 为 1 的执行计划SP_REMOVE_STORE_PLN(1);–禁用系统表 SYSPLNINFO 中 PLN_ID 为 1 的执行计划SP_SET_PLN_DISABLED(1,1);--解开禁用是06确认持久化计划是否生效可以通过dmp 直接计划方式导出新的执行计划–先确认SQL 对应的执行计划缓存号cache_itemselect cache_item,sqlstr,* from v$cachepln where sqlstr like %select /* NO_INDEX(t INDEX33555511) */ * from DMHR.TAB01 t where t.ID1;% ; 139649798914888 select /* NO_INDEX(t INDEX33555511) */ * from DMHR.TAB01 t where t.ID1; 139649798914888 SQL -1226422453 150994945 50331649 0 N 0 1 1036 select /* NO_INDEX(t INDEX33555511) */ * from DMHR.TAB01 t where t.ID1; 139649808224424 NULL 160 7 0 0 3 Y 56444 Y P Y N–打印内存中的缓存计划执行以下命令打印出缓存计划到默认路径默认路径在数据库实例目录的trace文件夹中 –假定cache_item139649798914888alter session set events immediate trace name plndump,level 139649798914888;欢迎访问达梦技术分享社区 ECOhttps://eco.dameng.com