- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第5章 索引和数据完整性
;在Oracle 11g中,索引是一种供服务器在表中快速查找一行的数据库结构。在数据库中建立索引主要有以下作用:
(1)快速存取数据;
(2)既可以改善数据库性能,又可以保证列值的唯一性;
(3)实现表与表之间的参照完整性;
(4)在使用ORDER BY、GROUP BY子句进行数据检索时,利用索引可以减少排序和分组的时间。
;对于下面的查询语句:
Select *
From s_emp
Where id=1;
Oracle如何找到该记录信息?
将s_emp表所涉及的data block全部读入内存,再从中找到id=1的记录。这称之为FTS(Full Table Scan)。
FTS的弊端;Rowid表示一条记录的物理位置,包含以下信息:
一条记录属于哪张表(Object_id)
一条记录属于哪个数据文件(File_id)
一条记录属于该数据文件的哪个数据块(Row_id)
一条记录是该数据块的第几条记录(Row_id)
Rowid字段的存在,可以保证在Oracle中绝对不会出现两条完全相同的记录。可以将其看作Oracle内部识别每条记录的主键,实际存放的是每条记录在硬盘的存放位置,即物理地址。
; 以Rowid作为查询条件,查询的速度要明显优于使用其他形式的条件,但是:; ; ;
;以在s_emp表的Last_name字段建索引为例:;有序
加速检索
减少I/O操作
索引的使用和维护由系统完成;;;;;(1)索引按存储方法分类,可以分为两类:B*树索引和位图索引。
B*树索引的存储结构类似图书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于图书的大目录,叶块相当于索引到的具体的书页。Oracle用B*树(B*-tree)机制存储索引条目,以保证用最短路径访问键值。;(2)索引按功能和索引对象可分为以下六种类型。
① 唯一索引。唯一索引意味着不会有两行记录相同的索引键值。唯一索引表中的记录没有RowID,所以不能再对其建立其他索引。
② 非唯一索引。不对索引列的值进行唯一性限制的称为非唯一索引。
③ 分区索引。所谓分区索引是指索引可以分散地存在于多个不同的表空间中,其优点是可以提高数据查询的效率。
④ 未排序索引。未排序索引也称为正向索引。由于Oracle 11g数据库中的行是按升序排序的,因此创建索引时不必指定对其排序而使用默认的顺序。
⑤ 逆序索引。逆序索引也称为反向索引。该索引同样保持索引列按顺序排列,但是颠倒已索引的每列的字节。
⑥ 基于函数的索引。基于函数的索引是指索引中的一列或者多列是一个函数或者表达式,索引根据函数或者表达式计算索引列的值。
;唯一索引
当在字段上创建PK和UK约束时,系统自动在相应的字段上创建唯一索引
Create Unique Index idx_kcb_kcm On Kcb(kcm)
复合索引
类似与复合主键,即在多个字段上创建一个索引
CREATE INDEX idx_XSB_xm_cssj
ON XSB(XM, CSSJ)
查询中经常出现形如:Where xm=…… and cssj=……
对于复合索引应将经常在查询条件中出现的列放在其他列前面。;经常查询的字段
不会经常执行Update操作的字段
经常出现在表连接条件中的字段
取值范围大重复值少的字段
字段有大量空值,但是经常查询所有非空值 记录的字段
小表不要建立索引
使用索引是否一定比全表扫描快?;索引的调用是由系统自动完成的,因此满足要求的Where子句才会触发系统调用索引。
字段在表达式中或函数参数的不会使用索引
如Where C1+0=1 与 Where round(C1)=1
Where salary*1212000 与 Where salary12000/12
如果函数经常使用,可以创建基于函数的索引
Create Index idx_test_c1 On Test(round(c1));部分隐式类型转换不会使用索引
Create Table Test
(C1 varhcar2(10),
C2 number
)
Select * Select *
From Test From Test
Where C1=1 Where C2=‘1’
不可以索引 可以索引
在查询的时候尽量不要为了懒省事而使用隐式类型转换。;形如:Where ColumeName Is Null的查询语句也无法使用索引。
因为索引中不记录空值。;数据完整性用于确保数据库中的数据遵循一定的商业和逻辑规则。
使用完整性约束有以下几个好处。
(1)在数据库应用的代码中增强了商业规则。
(2)使用存储过程,完整控制对数据的访问。
(
文档评论(0)