學習達夢hint注入筆記

xuchuangye發表於2024-08-20

1.建立表

drop table test;

SQL> create table test(id int,info varchar);
操作已執行

SQL> insert into test select level,'a' from dual connect by level <=10000;
影響行數 10000


SQL> create index idx_test_id on test(id);
操作已執行

SQL> stat 100 on test(id);
操作已執行

SQL> explain select * from test where id>1; --正常是走全表掃描
1 #NSET2: [1, 9999, 60]
2 #PRJT2: [1, 9999, 60]; exp_num(3), is_atom(FALSE)
3 #SLCT2: [1, 9999, 60]; TEST.ID > 1
4 #CSCN2: [1, 10000, 60]; INDEX33555470(TEST)

SQL> sp_set_para_value(1,'ENABLE_INJECT_HINT',1); --開啟ENABLE_INJECT_HINT引數
DMSQL 過程已成功完成

編輯hint注入

SQL> SF_INJECT_HINT('select * from test where id>1;','INDEX(TEST,IDX_TEST_ID)','INJECT1','test injecting hint', TRUE,TRUE);指定該語句使用IDX_TEST_ID索引
DMSQL 過程已成功完成

SQL> explain select * from test where id>1; --再次查詢走了索引
1 #NSET2: [10, 9999, 60]
2 #PRJT2: [10, 9999, 60]; exp_num(3), is_atom(FALSE)
3 #BLKUP2: [10, 9999, 60]; IDX_TEST_ID(TEST)
4 #SSEK2: [10, 9999, 60]; scan_type(ASC), IDX_TEST_ID(TEST), scan_range(1,max]

SELECT * from SYSINJECTHINT; ---查詢hint注入
SF_DEINJECT_HINT('INJECT1'); ----刪除hint 注入

應用中很多條件型別是?,這種也可以進行hint注入

SQL> SF_INJECT_HINT('* from test where id>?;','INDEX(TEST,IDX_TEST_ID)','INJECT2','test injecting hint', TRUE,TRUE);指定該語句使用IDX_TEST_ID索引
DMSQL 過程已成功完成

相關文章