根据索引的类型与where限制条件的不同 有 种类型的Oracle索引扫描
( ) 索引唯一扫描(index unique scan)
( ) 索引范围扫描(index range scan)
( ) 索引全扫描(index full scan)
( ) 索引快速扫描(index fast full scan)
一 索引唯一滑仔脊扫描(index unique scan)
通过唯一索引查找一个数值经常返回单个ROWID 如果该唯一索引有多个列组成(即组合索引) 则至少要有组合索引的引导列参与到该查询中 如创建一个索引 create index idx_test on emp(ename deptno loc) 则select ename from emp where ename = JACK and deptno = DEV 语句可以使用该索引 如果该语句只返回一行 则存取方法称为索引唯一扫描 而select ename from emp where deptno = DEV 语句则不会使用该索引 因为where子句种没有引导列 如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话 Oracle经常实现唯一性扫描
如
SQL>set autot traceonly exp 只显示执行计划
SQL>select * from scott emp t where t empno=
执行计划
Plan hash value:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
| | SELECT STATEMENT | | | | ( )| :
| | TABLE ACCESS BY INDEX ROWID| EMP | | | 戚档 ( )| :
|* | INDEX UNIQUE SCAN | PK_EMP | | | ( )| :
Predicate Information (identified by operation id):
access( T EMPNO = )
二.索引范围扫描(index range scan)
使用一个索引存取多行数据 同上面一样 如果索引是组合索引 而且select ename from emp where ename = JACK and deptno = DEV 语句返回多行数据 虽然该语句还是使用该组合索引进行查询 可此时的存取方法称为索引范围扫描
在唯一索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围 *** 作符(如><<>>= <= beeen)
使用索引范围扫描的例子
SQL>select empno ename from scott emp where empno >order by empno
执行计划
Plan hash value:
| Id | Operation 信渗 | Name | Rows | Bytes | Cost (%CPU)| Time
| | SELECT STATEMENT | | | | ( )| :
| | TABLE ACCESS BY INDEX ROWID| EMP | | | ( )| :
|* | INDEX RANGE SCAN | PK_EMP | | | ( )| :
Predicate Information (identified by operation id):
access( EMPNO >)
在非唯一索引上 谓词可能返回多行数据 所以在非唯一索引上都使用索引范围扫描
使用index rang scan的 种情况
(a) 在唯一索引列上使用了range *** 作符(><<>>= <= beeen)
(b) 在组合索引上 只使用部分列进行查询 导致查询出多行
(c) 对非唯一索引列上进行的任何查询
三.索引全扫描(index full scan)
与全表扫描对应 也有相应的全Oracle索引扫描 在某些情况下 可能进行全Oracle索引扫描而不是范围扫描 需要注意的是全Oracle索引扫描只在CBO模式下才有效 CBO根据统计数值得知进行全Oracle索引扫描比进行全表扫描更有效时 才进行全Oracle索引扫描 而且此时查询出的数据都必须从索引中可以直接得到
全Oracle索引扫描的例子
SQL>create index big_emp on scott emp(empno ename)
索引已创建
SQL>select empno ename from scott emp order by empno ename
执行计划
Plan hash value:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| | SELECT STATEMENT | | | | ( )| : : |
| | INDEX FULL SCAN | BIG_EMP | | | ( )| : : |
四. 索引快速扫描(index fast full scan)
扫描索引中的所有的数据块 与 index full scan很类似 但是一个显著的区别就是它不对查询出的数据进行排序 即数据不是以排序顺序被返回 在这种存取方法中 可以使用多块读功能 也可以使用并行读入 以便获得最大吞吐量与缩短执行时间
索引快速扫描的例子
SQL>select /*+ index_ffs(dave index_dave) */ id from dave where id>
执行计划
Plan hash value:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
| | SELECT STATEMENT | | | | ( )| : :
|* | INDEX FAST FULL SCAN| INDEX_DAVE | | | ( )| : :
Predicate Information (identified by operation id):
filter( ID >)
lishixinzhi/Article/program/Oracle/201311/16906CSSCAN(Character Set Scanner utility)是Oracle提供的一个用于检查字符集转换过程中可能会出现的数据丢失或者损坏的情况。也可以单独的扫描某些表某些列能否进行字符集转换,并且能够并行扫描以加快扫描速度。
提问:这个字符集扫描器的作用是什么呢?
回答:查找出在做字符集转换后,哪些内容无法转换需要单独处理,也就是确定并报告在数据转换过程中会出现的异常问题。
csscan工具检测完成之后,会报告如下三种类型的异常:
1)lossy conversions(有耗损的转换)
2)exceeded column length(超出的列长度)
3)convertible or exceptional data in the data dictionary(数据字典中可转换或者有异常的数据)
再提问:什么时候使用这个工具?
再回答:如果您像我一样,需求是从WE8ISO8859P1字符集升级到AL32UTF8字符集,那么,第一步就需要使用这个工具给您的宝贝数据库做一个全面的“体检”了。
2.安装csscan
1)在数据库安装完成之后就会自带这个工具。此工具的存放路径如下:
$ which csscan
/u01/app/oracle/product/11.2.0/db_1/bin/csscan
2)这个槐拦工具是二进制文件。
3.“实 *** 式”使用csscan现在开始,请大家打起精神。
1)第一步,以sys用户登陆,创建所需的CSMIG用户和数据字典对象。这个步骤是必要条件的,否则工具无法使用。
$ sqlplus / as sysdba
SQL>@?/rdbms/admin/csminst.sql
SQL>exit
2)“实 *** ”目标:对目前数据库做“不留死角”的检验。
首先,需要以具有SYSDBA权限的用户登录 *** 作;其次就是对这个工具的一些参誉洞数要有所了解。
下面的记录是在我的测试环境下演示的效果。
注意,这里为了使用具有SYSDBA权限的用户 *** 作采用了一个小技巧,如果不知道的话,可能会比较郁闷。
Shell下的小技巧是:userid="'"sys/sys as sysdba"'",只有这样使铅虚胡用才能顺利的执行。也可以把它放到参数文件中。
(1)如果使用参数文件,语法如下
$cd /home/oracle
$ vi csscan.par
userid="sys/sys as sysdba" full=y fromchar=we8iso8859p1 tochar=AL32UTF8 log=check.log capture=y array=1000000 process=4
$ csscan parfile=csscan.par
举例:
userid="sys/sys as sysdba" full=y fromchar=ZHS16CGB231280 tochar=AL32UTF8 log=check.log capture=y array=1000000 process=1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)