动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息



本月文章推荐
.Oracle学习手册:Oracle游标使用.
.提高Oracle数据库应用系统安全的.
.帮你解决Oracle 9i和Tomcat的端口.
.Oracle新手最经常碰到的6个错误及.
.快速掌握解决ORA-00844错误的实用.
.Oracle SQL中的RANK.
.Weblogic中访问oracle数据库的连.
.Oracle数据库加密曝漏洞 几分钟即.
.利用oracle高级复制功能实现数据.
.如何更改数据库的SCN?.
.详细讲解Oracle数据库管理员的工.
.更新系统表(props$)修改字符集.
.ORACLE 应用经验(4)-加密程序.
.Oracle 数据库系统使用经验.
.如何恢复只有完好数据文件的orac.
.Oracle是如何工作的.
.在Oracle数据库里用存储过程定期.
.Oracle PL/SQL语言初级教程之操作.
.利用Oracle的许可执行安全模式实.
.自己写个 C 程式.

跳跃式索引(Skip Scan Index)的浅析

发表日期:2008-2-9 |


在Oracle9i中,有一个新的特性:跳跃式索引(Skip Scan Index)。当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用到SS。此外,还可以通过使用提示index_ss(CBO下)来强制使用SS。 举例: SQL> create table test1 (a number, b char(10), c varchar2(10)); Table created. SQL> create index test_idx1 on test1(a, b); Index created. SQL> set autotrace on SQL> select /*+index_ss(test1 test_idx1)*/* from test1 a 2 where b ='a'; no rows selected Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=32) 1 0 TABLE Access (BY INDEX ROWID) OF 'TEST1' (Cost=2 Card=1 Bytes=32) 2 1 INDEX (SKIP SCAN) OF 'TEST_IDX1' (NON-UNIQUE)
但并不是任何情况下都会使用到SS。在Oracle的官方文档中,除了提到需要CBO,并且对表进行过分析外,还需要保证第一列的distinct value非常小。这一段是从官方文档上摘取的关于SS的一段解释: Index skip scans improve index scans by nonprefix columns since it is often faster to scan index blocks than scanning table data blocks. In this case a composite index is split logically into smaller subindexes. The number of logical subindexes depends on the cardinality of the initial column. Hence it is now possible to use the index even if the leading column is not used in a where clause. Oracle并没有公布过关于SS更多的内部技术细节。但注重上面的这句话:In this case a composite index is split logically into smaller subindexes. The number of logical subindexes depends on the cardinality of the initial column.即Oralce会对复合索引进行逻辑划分,分成多个子索引。可以这样理解,Oracle将索引从逻辑上划分为a.num_distinct个子索引,每次对一个子索引进行扫描。因此SS的索引扫描成本为a.num_distinct. 下面做一些试验,看看在什么情况下Oracle采用SS. 首先要保证使用SS的几个必要条件: · Optimizer为CBO · 相关表要有正确的统计数据 · Oracle DB版本为9i以上 下面就是一个使用到SS的非凡条件:第一列的distinct num要足够小。小到什么程度呢?
还是以上面的表为例(省略中间的麻烦步骤,取两个临界值做实验): 取第一列distinct number为37: SQL> truncate table test1; Table truncated. SQL> begin 2 for i in 1..100000 loop 3 insert into test1 values (mod(i,37), to_char(i), to_char(i)); 4 end loop;p; 5 commit; 6 end; 7 / PL/SQL procedure sUCcessfully completed. SQL> analyze table test1 compute statistics; Table analyzed. SQL> set autotrace on eXPlain SQL> select * from test1 2 where b = '500'; A B C ---------- ---------- ---------- 19 500 500 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=37 Card=1 Bytes=17) 1 0 TABLE ACCESS (FULL) OF 'TEST1' (Cost=37 Card=1 Bytes=17) 再取第一列distinct number为36: SQL> truncate table test1; Table truncated. SQL> begin 2 for i in 1..100000 loop 3 insert into test1 values (mod(i,36), to_char(i), to_char(i)); 4 end loop; 5 commit; 6 end; 7 / PL/SQL procedure successfully completed. SQL> analyze table test1 compute statistics;
Table analyzed. SQL> select * from test1 where b = '500'; A B C ---------- ---------- ---------- 32 500 500 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=17) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST1' (Cost=12 Card=1 B ytes=17) 2 1 INDEX (SKIP SCAN) OF 'TEST_IDX1' (NON-UNIQUE) (Cost=37 C ard=1) 从上面试验结果看,FTS的cost是37。当第一列distinct number小于这个值时,Oracle选择了SS。 继续试验: SQL> select count(*) from test1 2 where b <= '1'; COUNT(*) ---------- 1 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=10) 1 0 SORT (AGGREGATE) 2 1 INDEX (SKIP SCAN) OF 'TEST_IDX1' (NON-UNIQUE) (Cost=37 C ard=1 Bytes=10) 注重:在b中’10’是比’1’大的最小值(char(10)类型) SQL> select count(*) from test1 2 where b <= '10'; COUNT(*) ---------- 2 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=37 Card=1 Bytes=10) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TEST1' (Cost=37 Card=773 Bytes=7 730) 观察结果,这时候影响的因素是cardinality了。第二个查询计划中的cardinality值(773)正是b<=’10’的cardinality值:
SQL> set autotrace off SQL> select 100000*(to_number('31302020202020202020', 'xxxxxxxxxxxxxxxxxxxx')-to _number('31202020202020202020', 'xxxxxxxxxxxxxxxxxxxx'))/(to_number('39393939392 020202020', 'xxxxxxxxxxxxxxxxxxxx')-to_number('31202020202020202020', 'xxxxxxxxx xxxxxxxxxxx'))+1 from dual; 100000*(TO_NUMBER('31302020202020202020','XXXXXXXXXXXXXXXXXXXX')-TO_NUMBER('3120 -------------------------------------------------------------------------------- 772.791768 再看一个含有第一列条件的等效的语句: SQL> set autotrace on explain SQL> select count(*) from test1 2 where a>=0 3 and b <='1'; COUNT(*) ---------- 1 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=12) 1 0 SORT (AGGREGATE) 2 1 INDEX (SKIP SCAN) OF 'TEST_IDX1' (NON-UNIQUE) (Cost=37 C ard=1 Bytes=12) 再做几个有趣的试验,下面的试验条件是不满足SS的,但是请注重查询返回列队查询计划的影响: SQL> truncate table test1; Table truncated. SQL> begin 2 for i in 1..100000 loop 3 insert into test1 values (i, to_char(i), to_char(i)); 4 end loop; 5 commit; 6 end; 7 / PL/SQL procedure successfully completed. SQL> analyze table test1 compute statistics; Table analyzed. SQL> select * from test1
2 where b = '500'; A B C ---------- ---------- ---------- 500 500 500 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=37 Card=1 Bytes=19) 1 0 TABLE ACCESS (FULL) OF 'TEST1' (Cost=37 Card=1 Bytes=19) 改变返回列: SQL> select count(*) from test1 2 where b = '500'; COUNT(*) ---------- 1 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=34 Card=1 Bytes=10) 1 0 SORT (AGGREGATE) 2 1 INDEX (FAST FULL SCAN) OF 'TEST_IDX1' (NON-UNIQUE) (Cost =34 Card=1 Bytes=10) 再改变一种: SQL> select a from test1 2 where b = '500'; A ---------- 500 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=34 Card=1 Bytes=14) 1 0 INDEX (FAST FULL SCAN) OF 'TEST_IDX1' (NON-UNIQUE) (Cost=3 4 Card=1 Bytes=14) 使用RBO呢? SQL> select /*+rule*/a from test1 2 where b = '500'; A ---------- 500 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=HINT: RULE 1 0 TABLE ACCESS (FULL) OF 'TEST1'
值得一提的是,上述任何一个例子在8i中执行的话,都不会使用到索引(无论是否符合SS的条件)。 

Trackback: http://tb.blog.csdn.net/TrackBack.ASPx?PostId=1479527
上一篇:Linux下启停Oracle服务 人气:523
下一篇:修改ORACLE的DATAFILE文件名 人气:347
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵