在Oracle 9中伪造存储分析
| 副标题[/!--empirenews.page--] 在 前面的文章中,我讨论到存储概要,并且描述了一种通过滥用系统来生成你所需要存储概要的方法.我同时也指出,在Oracle 9中使用这种方法存在一些风 险,因为存储在数据库中的细节信息已经变得非常复杂.在接下来的文章中,我将介绍一种合法的操作存储概要的方法,这种方法可以应用在Oracle 8与 Oracle 9中.这篇文章的细节都是基于实验得出的,实验环境是Oracle 8.1.7.0与Oracle 9.2.0.1的默认安装环境. 
 回顾 
 当你知道如何通过给一段DML语句添加提示就可以让它运行的快很多,但是你却没有访问源代码并将提示放到适当位置的途径, 你会怎么做? 
 在上一篇文章中,我展示了你可以如何用存储概要(也被称为执行计划稳定性)来驱使数据库引擎为你做这种工作. 
 一个存储概要由两个组件组成(宽泛地讲)-一个你希望控制的SQL语句,一组每当Oracle发现这条SQL被优化都将在它上面应用的提示.这两个组件都被保存在一个被称为outln的数据库schema中. 
 我们可以使用一组如图-1中类似的查询语句来检查保存在其中的SQL语句,以及附着在这条SQL语句上的提示. 
 1 select name, used, sql_text 
 2 from user_outlines 
 3 where category = 'DEFAULT' 
 4 ; 
 5 
 6 select stage, node, hint 
 7 from user_outline_hints 
 8 where name = '{one of the names}' 
 9 ; 
 Figure 1 Examining stored outlines. 
 在前面的文章中,我介绍了这样一种想法来欺骗系统, 使用合法的方法创建一个存储概要, 接着,使用一个文本相似的但已经添加过提示的语句来创建一个存储概要,最后,使用一组SQL语句来交换这两个存储概要的实际结果来修复存储概要. 
 当时,我曾提到这种方法对Oracle 8来讲或许是安全的,但是由于在新版本中引入的变化, 在Oracle 9中可能会导致问题. 
 这篇文章将对这些变化进行考查, 介绍一种合法的方法来得到你想要的一组存储到outln中的提示,用来解决你的那些问题语句. 
 相关变化 
 如果你登录到outln schema(在Oracle 9中它默认是锁住的)查看可用的表清单,你将发现Oracle 9比Oracle 8多出来一张表. 这些表为: 
 ol$ SQL语句 
 ol$hints 提示表 
 ol$nodes 查询块 
 第三张表是一张新表,被用来将提示列表与这条SQL语句(一份内部重写的版本)的多个不同查询块.你还将发现,提示列表(ol$hints)也被加强了,其中还包括文本长度与偏移量的细节信息. 
 图2为这三张表的详细描述,用星号标注了Oracle 9中出现的新字段. 
 01 ol$ 
 02 
 03 OL_NAME VARCHAR2(30) 
 04 SQL_TEXT LONG 
 05 TEXTLEN NUMBER 
 06 SIGNATURE RAW(16) 
 07 HASH_VALUE NUMBER 
 08 HASH_VALUE2 NUMBER *** 
 09 CATEGORY VARCHAR2(30) 
 10 VERSION VARCHAR2(64) 
 11 CREATOR VARCHAR2(30) 
 12 TIMESTAMP DATE 
 13 FLAGS NUMBER 
 14 HINTCOUNT NUMBER 
 15 SPARE1 NUMBER *** 
 16 SPARE2 VARCHAR2(1000) *** 
 17 
 18 Ol$hints 
 19 
 20 OL_NAME VARCHAR2(30) 
 21 HINT# NUMBER 
 22 CATEGORY VARCHAR2(30) 
 23 HINT_TYPE NUMBER 
 24 HINT_TEXT VARCHAR2(512) 
 25 STAGE# NUMBER 
 26 NODE# NUMBER 
 27 TABLE_NAME VARCHAR2(30) 
 28 TABLE_TIN NUMBER 
 29 TABLE_POS NUMBER 
 30 REF_ID NUMBER *** 
 31 USER_TABLE_NAME VARCHAR2(64) *** 
 32 COST FLOAT(126) *** 
 33 CARDINALITY FLOAT(126) *** 
 34 BYTES FLOAT(126) *** 
 35 HINT_TEXTOFF NUMBER *** 
 36 HINT_TEXTLEN NUMBER *** 
 37 JOIN_PRED VARCHAR2(2000) *** 
 38 SPARE1 NUMBER *** 
 39 SPARE2 NUMBER *** 
 40 
 41 ol$nodes (completely new in 9) 
 42 
 43 OL_NAME VARCHAR2(30) 
 44 CATEGORY VARCHAR2(30) 
 45 NODE_ID NUMBER 
 46 PARENT_ID NUMBER 
 47 NODE_TYPE NUMBER 
 48 NODE_TEXTLEN NUMBER 
 49 NODE_TEXTOFF NUMBER 
 Figure 2 The outln tables. 
 (编辑:锡盟站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 

