Oracle索引梳理系列(一)- Oracle访问数据的方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载。转载时,请在文章明显位置注明原文链接。若在未经作者同意的情况下,将本文内容用于商业用途,将保留追究其法律责任的权利。如果有问题,请以邮箱方式联系作者(793113046@qq.com)。
Oracle访问数据的方法
Oracle访问数据主要通过三种办法实现:
- 通过全表扫描的方式访问数据
- 通过ROWID访问数据
- 通过索引的方式访问数据
1.1 通过全表扫描访问表(TABLE ACCESS FULL)
- oracle顺序读取表中所有的行,并逐条匹配WHERE限定条件。
- 采用多块读的方式进行全表扫描,可以有效提高系统的吞吐量,降低I/O次数。
- 即使创建索引,oracle也会根据CBO的计算结果,决定是否使用索引。
注意事项:
- 只有全表扫描时才可以使用多块读。该方式下,单个数据块仅访问一次。
- 对于数据量较大的表,不建议使用全表扫描进行访问。
- 当访问表中的数据量超过数据总量的5%—10%时,通常oracle会采用全表扫描的方式进行访问。
- 并行查询可能会导致优化器选择全表扫描的方式。
示例:
Yumiko@sunny >set autotrace traceonly
Yumiko@sunny >select * from scott.emp;
已选择14行。 执行计划
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 518 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 518 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------- 统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
8 consistent gets
0 physical reads
0 redo size
1539 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
其中,红色的“TABLE ACCESS FULL”表示采用的全表扫描。
1.2 通过ROWID访问表(TABLE ACCESS BY ROWID)
- ROWID是数据存放在数据库中的物理地址,能够唯一标识表中的一条数据。
- ROWID指出了一条记录所在的数据文件、块号以及行号的位置,因此通过ROWID定位单行数据是最快的方法。
注意事项:
- ROWID作为一个伪列,其数值并不存储在数据库中,当查询时才进行计算。
- ROWID除了在同一集簇中可能不唯一外,每条记录的ROWID唯一。
示例:
--查询记录的rowid
Yumiko@sunny >select rowid,ename from scott.emp where ename='SMITH'; ROWID ENAME
------------------ ----------
AAAVREAAEAAAACXAAA SMITH --利用rowid查询数据
Yumiko@sunny >set autotrace on
Yumiko@sunny >select empno,ename from scott.emp where rowid='AAAVREAAEAAAACXAAA'; EMPNO ENAME
---------- ----------
7369 SMITH 执行计划
----------------------------------------------------------
Plan hash value: 1116584662 -----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 22 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY USER ROWID| EMP | 1 | 22 | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------- 统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
1 consistent gets
0 physical reads
0 redo size
598 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
其中,红色的“TABLE ACCESS BY USER ROWID”表示采用ROWID方式访问数据。
1.3 通过INDEX访问表
- 通过索引查找相应数据行的rowid,再根据rowid查找表中实际数据的方式称为“索引查找”或者“索引扫描”。
- 一个rowid对应一条数据行(根据rowid查找结果,仅需要对rowid相应数据的数据块进行一次I/O操作),因此该方式属于“单块读”。
- 对于索引,除了存储索引的数据外,还保存有该数据对应的rowid信息。
- 索引扫描分为两步:1)扫描索引确定相应的rowid信息。 2)根据rowid从表中获得对应的数据。
注意事项:
- 对于选择性高的数据行,索引的使用会提升查询的性能。但对于DML操作,尤其是批量数据的操作,可能会导致性能的降低。
- 全表扫描的效率不一定比索引扫描差,关键看数据在数据块上的具体分布。
示例:
--查看目标用户的索引对象及其名称
Yumiko@sunny >select owner,object_name,object_type from dba_objects where owner='SCOTT'; OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------- -------------------
SCOTT PK_DEPT INDEX
SCOTT DEPT TABLE
SCOTT EMP TABLE
SCOTT PK_EMP INDEX
SCOTT BONUS TABLE
SCOTT SALGRADE TABLE --查看目标索引所在的表及其列信息
Yumiko@sunny >select index_name,table_name,column_name from dba_ind_columns where index_name='PK_EMP'; INDEX_NAME TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------ --------------------
PK_EMP EMP EMPNO --打开会话跟踪
Yumiko@sunny >set autotrace on --使用索引列执行查询并查看执行计划
Yumiko@sunny >select empno,ename from scott.emp where empno=''; EMPNO ENAME
---------- ----------
7369 SMITH 执行计划
----------------------------------------------------------
Plan hash value: 2949544139 --------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 10 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 10 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:00:01 |
-------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("EMPNO"=7369) 统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
1 physical reads
0 redo size
598 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
上面红色的“INDEX UNIQUE SCAN”表示采用了索引扫描。同时根据执行计划,可以清晰地看到索引扫描的执行路径,既先进行索引扫描,然后根据得到的rowid信息进行表数据的访问。
Oracle索引梳理系列(一)- Oracle访问数据的方法的更多相关文章
- Oracle优化器基础知识之访问数据的方法
目录 一.访问数据的方法 1.直接访问数据 2.访问索引 一.访问数据的方法 Oracle访问表中数据的方法有两种,一种是直接表中访问数据,另外一种是先访问索引,如果索引数据不符合目标SQL,就回表, ...
- Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle索引梳理系列(六)- Oracle索引种类之函数索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle索引梳理系列(五)- Oracle索引种类之表簇索引(cluster index)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle索引梳理系列(二)- Oracle索引种类及B树索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle索引梳理系列(四)- Oracle索引种类之位图索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Oracle索引梳理系列(三)- Oracle索引种类之反向索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
随机推荐
- Android Volley框架的使用(1)
在Android开发中,经常要通过HTTP请求访问网络.为了使通过HTTP请求访问网络的过程更加简单,2013年提出了新的HTTP通信框架--Volley.Volley使用起来非常简单,适用于网络访问 ...
- 设置surfaceView的背景为透明
1. [代码][Java]代码 下面三句话加上就好了. surfaceView.setZOrderOnTop(true); surfaceView.setEGLConfigChooser(, , ...
- java servlet手机app访问接口(四)推送
一. 服务端DEMO下载及运行. 登录友盟后,浏览器直接输入下面这个URL,直接进入文档开发和DEMO下载页面:http://dev.umeng.com/push/ios/integration(下面 ...
- PostgreSQL的case when
select tt.dict_label as display_item,t1.ratio from (select t.product_level,round(sum(case when t.det ...
- Java 经典实例:自定义迭代器
编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterable后,可以用"foreach"循环遍历你的对象. import java.util.Itera ...
- Centos安装Memcached和(Nginx)Memcache扩展详细教程
下载memadmin,下载地址:http://www.junopen.com/memadmin/ 并在IIS新建站点. 测试地址:http://wap.yousawang.com/mem , 1.重启 ...
- 优秀的 HTML5 实战教程,提升你的综合开发能力
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- AngularJS1.3一些技巧
前言 框架选择.在上一篇文章评论中,有人说angular1.3是个过时的东西,建议使用angular2.其实这种说法很像拿jQuery1.x和jQuery2.x做比较,新的版本当然会有优化优势的地方, ...
- ID卡和IC卡
1.ID卡 ID卡就是一种身份识别卡,卡内除了卡号之外,无任何加密功能. ID卡的工作原理:它是由卡.读卡器.后台控制器组成的. (1)读卡器通过天线发射射频信号 (2)当卡进入信号范围内后卡被激活 ...
- Office 365 - SharePoint 2013 Online 中使用Windows PowerShell
1.如果想要在SharePoint Online中使用Windows PowerShell,首先需要安装SharePoint Online Management Shell(下载地址附后),如下图: ...