一、oracle访问数据的存取方法
1.1 全表扫描(Full Table Scans, FTS)
1.1.1 描述:
1) Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件。
2) 极大的减少了I/O总次数,提高了系统的吞吐量。
3) 只有在全表扫描的情况下才能使用多块读操作。
4) 在这种访问模式下,每个数据块只被读一次。
1.1.2 例子:
SQL> explain plan for select * from dual;
Query Plan
-----------------------------------------
SELECT STATEMENT[CHOOSE] Cost=
TABLE ACCESS FULL DUAL
1.2通过ROWID的表存取(Table Access by ROWID或rowid lookup)
1.2.1 描述:
1) 通过ROWID来存取数据可以快速定位到目标数据上。
2) 是Oracle存取单行数据的最快方法。
3) 一次I/O只能读取一个数据块。
1.2.2 例子:
SQL> explain plan for select * from dept where rowid = 'AAAAyGAADAAAAATAAF';
Query Plan
------------------------------------
SELECT STATEMENT [CHOOSE] Cost=1
TABLE ACCESS BY ROWID DEPT [ANALYZED]
1.3 索引扫描(Index Scan或index lookup)
1.3.1 描述:
1) 在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。
2) 索引扫描可以由2步组成: (1)扫描索引得到对应的rowid值。
(2) 通过找到的rowid从表中读出具体的数据。
3) 第一步通常是逻辑I/O,第二步对于大表来说会有部分物理I/O。所以对于大表使用该扫描方式,效率会下降许多。
4) 若能避免第二步,则效率还是很高的。
1.3.2 例子:
SQL> explain plan for select empno, ename from emp where empno=10;
Query Plan
------------------------------------
SELECT STATEMENT [CHOOSE] Cost=1
TABLE ACCESS BY ROWID EMP [ANALYZED]
INDEX UNIQUE SCAN EMP_I1
SQL> explain plan for select empno from emp where empno=10;-- 只查询empno列值
Query Plan
------------------------------------
SELECT STATEMENT [CHOOSE] Cost=1
INDEX UNIQUE SCAN EMP_I1
1.3.4 扩展:
根据索引的类型与where限制条件的不同,有4种类型的索引扫描:
·索引唯一扫描(index unique scan)
通过唯一索引查找一个数值经常返回单个ROWID。如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描。
使用唯一性约束的例子:
select empno,ename from emp where empno=10;
·索引范围扫描(index range scan)
使用一个索引存取多行数据,在唯一索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围操作符(如>、<、<>、>=、<=、between)
使用索引范围扫描的例子:
select empno,ename from emp where empno > 7876 order by empno;
·索引全扫描(index full scan)
与全表扫描对应,也有相应的全索引扫描。而且此时查询出的数据都必须从索引中可以直接得到。
全索引扫描的例子:
select empno, ename from big_emp order by empno,ename;
·索引快速扫描(index fast full scan)
扫描索引中的所有的数据块,与 index full scan很类似,但是一个显著的区别就是它不对查询出的数据进行排序,即数据不是以排序顺序被返回。在这种存取方法中,可以使用多块读功能,也可以使用并行读入,以便获得最大吞吐量与缩短执行时间。
索引快速扫描的例子:
select empno,ename from big_emp;
二、Oracle函数
1.单行函数:
函数 结果
1.1 大小写控制函数: lower('SQL plus') sql plus
upper('SQL plus') SQL PLUS
initcap('SQL plus') Sql Plus
2.多行函数:
----------------------------------------------------------------------------------------------------------------------------
参考文献:
1.http://database.51cto.com/art/200703/43583.htm