解析Oracle 8i/9i的计划稳定性
2006-08-05 11:58:19 来源:WEB开发网我们可以看到在demo的分类中只有一个存储概要,查看概要中的sql_text我们可以看到与我们原来PL/SQL代码类似的、但又有点不同的语句。这是很重要的一点,因为Oracle仅在存储的sql_text和将要执行的SQL非常相似的时候才会使用存储概要。实际上,在Oracle8i中,两个SQL语句要完全一样才可以,这也是存储概要的一个大问题。
你可以由列表中看到存储概要中是一套hints用来描述Oracle如何执行(或者将要执行)该SQL。这个计划使用一个全表搜索--即使是一个全表搜索这样的操作,Oracle使用大量的hints来确保执行的计划。
要注意到存储概要通常都是属于一个分类的;在这里是demo分类,我们是通过alter session命令来指定的。如果在上面的命令中,我们使用true来代替demo,我们将在一个名字为default的分类中找到该存储概要。
存储概要都有一个名字,该名字在整个数据库中都必须是唯一的。没有两个概要的名字是相同的,即使是它们是由不同的用户产生。实际上,概要并不是由谁拥有的,它们仅有创建者。如果你创建的一个存储概要和我以后执行的一个SQL语句匹配,Oracle将会应用你的hints列表到我的语句--即使这些hints在我的模式中是无意义的。(这样我们就有完全不同的选项来欺骗存储概要,不过这是另一篇文章的事情了)。你还可能注意到,当Oracle自动产生存储概要时,它的名字中包含有一个接近毫秒的时间戳。
继续处理我们那个有问题的SQL,我们判定如果使用一个/*+ and_equal(so_demo, sd_i1, sd_i2) */ 的hint,那么Oracle将会使用我们想要的执行路径,所以我们现在通过以下的方法显式创建一个存储概要:
create or replace outline so_fix
for category demo on
select /*+ and_equal(so_demo, sd_i1, sd_i2) */ v1
from so_demo
where n1 = 1
and n2 = 2;
- ››oracle 中 UPDATE nowait 的使用方法
- ››Oracle ORA-12560解决方法
- ››Oracle 10g RAC 常用维护命令
- ››Oracle如何在ASM中定位文件的分布
- ››Oracle的DBMS_RANDOM.STRING 的用法
- ››oracle 外部表导入时间日期类型数据,多字段导入
- ››Oracle中查找重复记录
- ››oracle修改用户登录密码
- ››Oracle创建删除用户、角色、表空间、导入导出等命...
- ››Oracle中登陆时报ORA-28000: the account is lock...
- ››Oracle数据库在配置文件中更改最大连接数
- ››Oracle中在pl/sql developer修改表的两种方式
更多精彩
赞助商链接