




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据库速度优化与数据完整性数据库速度优化与数据完整性 对于大型应用中的数据库系统,性能和安全是两个对于大型应用中的数据库系统,性能和安全是两个 重要的方面。这里的性能指的是重要的方面。这里的性能指的是 数据库处理和响应客户端数据库处理和响应客户端 的速度;而保证数据完整性则是安全的体现。本章将详细讲的速度;而保证数据完整性则是安全的体现。本章将详细讲 述如何利用索引来提高数据库性能,并综合利用各种约束来述如何利用索引来提高数据库性能,并综合利用各种约束来 保证数据完整性。保证数据完整性。 l索引的原理;索引的原理; l利用索引提高数据库性能;利用索引提高数据库性能; l数据库完整性简介;数据库
2、完整性简介; l利用约束保持数据库完整性。利用约束保持数据库完整性。 18.1 18.1 利用索引加快数据引用利用索引加快数据引用 在数据库系统中,索引是非常重要的一个对象,尤在数据库系统中,索引是非常重要的一个对象,尤 其是面对大型数据表时,索引能大大提高数据检索的速度。其是面对大型数据表时,索引能大大提高数据检索的速度。 本节将介绍索引的原理及索引的使用。本节将介绍索引的原理及索引的使用。 18.1.1 18.1.1 索引的原理索引的原理 索引在现实世界中最典型的例子莫过于字典检索了索引在现实世界中最典型的例子莫过于字典检索了 。用户在使用字典时,可以使用两种方式,一是逐页翻查,。用户在使
3、用字典时,可以使用两种方式,一是逐页翻查, 以获得需要查找的目标;二是根据字典的检索目录来获得目以获得需要查找的目标;二是根据字典的检索目录来获得目 标所在的页数,然后直接在该页获得查找目标。毫无疑问,标所在的页数,然后直接在该页获得查找目标。毫无疑问, 利用检索目录(索引)检索目标是更为高效的方式。利用检索目录(索引)检索目标是更为高效的方式。 现有的主流数据库都提供了索引这一概念,现有的主流数据库都提供了索引这一概念,Oracle 也不例外。一旦在数据表的某列上建立了索引,也不例外。一旦在数据表的某列上建立了索引,Oracle将另将另 辟新的空间,以存储该列上所有值与其记录的辟新的空间,以
4、存储该列上所有值与其记录的rowid的对应的对应 关系。当用户试图以索引列作为搜索条件时,关系。当用户试图以索引列作为搜索条件时,Oracle将利用将利用 索引来获得相应的索引来获得相应的rowid,并捕获该记录。,并捕获该记录。 select * from people where name = David; 当当Oracle处理该查询语句时,将执行全表扫描。当处理该查询语句时,将执行全表扫描。当 搜索到第搜索到第6条记录时,会发现该条记录符合搜索条件,并将条记录时,会发现该条记录符合搜索条件,并将 该记录纳入结果集合。但是搜索并不会停止,因为该记录纳入结果集合。但是搜索并不会停止,因为Or
5、acle并并 不知道在后面的记录中是否仍然存在符合条件的记录。直至不知道在后面的记录中是否仍然存在符合条件的记录。直至 搜索完整个表,搜索完整个表,Oracle才会返回最终的结果集合。才会返回最终的结果集合。 18.1.1 18.1.1 索引的原理索引的原理 但是,如果预先在表但是,如果预先在表people的的name列上创建了一列上创建了一 个索引,那么,搜索的顺序将完全不同。创建索引的语法如个索引,那么,搜索的顺序将完全不同。创建索引的语法如 下所示:下所示: create index idx_people_name on people(name) 一旦索引创建,那么表中所有数据将按照字母
6、表顺一旦索引创建,那么表中所有数据将按照字母表顺 序进行分块处理,例如,以每序进行分块处理,例如,以每5条记录作为一个数据块(当条记录作为一个数据块(当 然,实际数据块将大得多)。分块后的数据结构如下图所示然,实际数据块将大得多)。分块后的数据结构如下图所示 。 18.1.1 18.1.1 索引的原理索引的原理 此时执行搜索语句此时执行搜索语句select * from people where name = David;时,时,Oracle只会在第一个数据块中进行搜只会在第一个数据块中进行搜 索,因为数据库知道,第二个数据库都是索,因为数据库知道,第二个数据库都是M以后的数据。当以后的数据。
7、当 搜索到搜索到David之后,如果下一条记录的之后,如果下一条记录的name列的值不是列的值不是 David,Oracle也将停止搜索,因为列中所有值都是按照字也将停止搜索,因为列中所有值都是按照字 母表顺序进行排列的,所有的母表顺序进行排列的,所有的“David”位置肯定是相邻的位置肯定是相邻的 。一旦搜索到。一旦搜索到“David”,Oracle会马上获得其对应的会马上获得其对应的rowid ,并根据,并根据rowid快速定位该记录。快速定位该记录。 对于如下对于如下SQL语句,索引的作用会反映的更加清晰语句,索引的作用会反映的更加清晰 。 select * from people wh
8、ere name = Michael; 因为要搜索的条件为因为要搜索的条件为name列的值为列的值为“Michael”, 所以,将会直接跳转到第二个数据块进行搜索,因为第二个所以,将会直接跳转到第二个数据块进行搜索,因为第二个 数据块才是以数据块才是以M开头的数据。而且,当获得开头的数据。而且,当获得Michael的下一的下一 条记录为条记录为“Richard”时,将停止搜索,返回结果集合。时,将停止搜索,返回结果集合。 18.1.2 18.1.2 利用索引提高数据库性能利用索引提高数据库性能 索引应用于大数据量的数据表时,将很大程度上提高查索引应用于大数据量的数据表时,将很大程度上提高查 询
9、速度。为了演示这种情况,首先来创建一个大的数据表。视询速度。为了演示这种情况,首先来创建一个大的数据表。视 图图dba_objects可以获得数据库中所有对象的基本信息可以获得数据库中所有对象的基本信息 create table test_objects as select * from dba_objects; 利用利用PL/SQL Developer的执行计划查看:的执行计划查看: select * from test_objects where object_name = PEOPLE 创建索引:创建索引: create index idx_test_object on test_obj
10、ects(object_name); 再次查看执行计划。再次查看执行计划。 这里需要注意的是,搜索条件中包含索引列才能真正使这里需要注意的是,搜索条件中包含索引列才能真正使 用到索引所带来的好处。用到索引所带来的好处。 select * from test_objects where owner = SCOTT 18.1.3 18.1.3 索引对索引对DMLDML的影响的影响 1添加数据对索引的影响添加数据对索引的影响 以表以表people为例,一旦在其上创建了索引,向其中为例,一旦在其上创建了索引,向其中 插入数据时,数据库将会重新组织索引。插入数据时,数据库将会重新组织索引。 insert
11、 into people (ID, NAME, STATUS) values (11, Zoey, ACT); 在以上在以上SQL语句中,向表语句中,向表people中插入名为中插入名为 “Zoey”的用户信息。此时数据库除了正常的插入操作开销的用户信息。此时数据库除了正常的插入操作开销 之外,还需要将为该记录添加索引项,而索引已有数据块无之外,还需要将为该记录添加索引项,而索引已有数据块无 法满足存储要求,因此,数据库将为其分配新的存储空间,法满足存储要求,因此,数据库将为其分配新的存储空间, 如图所示。如图所示。 18.1.3 18.1.3 索引对索引对DMLDML的影响的影响 inser
12、t into people (ID, NAME, STATUS) values (12, Bill, ACT); 此时,除了要针对数据表的插入操作之外,对索引此时,除了要针对数据表的插入操作之外,对索引 的修改将变得更加繁琐。因为的修改将变得更加繁琐。因为“Bill”需要插入到需要插入到Charles之之 前,而巧合的是,第一个数据块已经是满的状态,那么就需前,而巧合的是,第一个数据块已经是满的状态,那么就需 要从第一个数据块中为要从第一个数据块中为“Bill”空出一个位置,结果将造成连空出一个位置,结果将造成连 锁反应。锁反应。 18.1.3 18.1.3 索引对索引对DMLDML的影响的影
13、响 2修改数据对索引的影响修改数据对索引的影响 修改数据的操作对索引的影响稍稍不同,例如,将表修改数据的操作对索引的影响稍稍不同,例如,将表 people中原名中原名“James”修改为修改为“Winne”,那么可以利用如下,那么可以利用如下 SQL语句。语句。 update people set name = Winne Where name = James; 修改数据会直接反应在数据表中,但是索引项将不会被修改数据会直接反应在数据表中,但是索引项将不会被 删除。原索引项删除。原索引项“James”只是被标记为不可用,而为只是被标记为不可用,而为“Winne” 新添索引项。新添索引项。 18
14、.1.3 18.1.3 索引对索引对DMLDML的影响的影响 2修改数据对索引的影响修改数据对索引的影响 从图中可以看出,从图中可以看出,“James”被添加了删除标记,而被添加了删除标记,而 在最后一个数据块中添加了索引项在最后一个数据块中添加了索引项“Winne”。Oracle采取采取 该策略是为了最大程度上减小数据库操作的开销。但这同时该策略是为了最大程度上减小数据库操作的开销。但这同时 带来了空间上的浪费,因为索引项带来了空间上的浪费,因为索引项“James”仍然占用索引仍然占用索引 空间。新的索引项仍然不能够插入第一个数据块中。空间。新的索引项仍然不能够插入第一个数据块中。 3. 删
15、除数据对索引的影响删除数据对索引的影响 删除数据对索引的影响相对简单,因为数据删除之删除数据对索引的影响相对简单,因为数据删除之 后,相应的索引项只是被打上了删除标记,表征该索引项不后,相应的索引项只是被打上了删除标记,表征该索引项不 可用。例如,利用如下可用。例如,利用如下SQL语句删除一条记录。语句删除一条记录。 delete from people where name = Robert 18.1.3 18.1.3 索引对索引对DMLDML的影响的影响 此时的索引项被修改为:此时的索引项被修改为: 分析此时的索引结构可知,删除操作是分析此时的索引结构可知,删除操作是DML操作中针操作中针
16、 对索引的开销最小的一种。但是,仍然不可避免地形成了对对索引的开销最小的一种。但是,仍然不可避免地形成了对 存储空间的浪费。存储空间的浪费。 18.1.4 18.1.4 索引的使用时机索引的使用时机 1小数据量的表不宜使用索引小数据量的表不宜使用索引 小数据量的表,首先要创建索引,并寻找数据块,小数据量的表,首先要创建索引,并寻找数据块, 然后才进行数据的实际搜索,因此,对于小数据量的表,使然后才进行数据的实际搜索,因此,对于小数据量的表,使 用全表搜索往往会快于使用索引。用全表搜索往往会快于使用索引。 2频繁使用插入、修改、删除等频繁使用插入、修改、删除等DML操作的数据表操作的数据表 不宜
17、使用索引。不宜使用索引。 针对表的插入、修改、删除等操作非常频繁时,将针对表的插入、修改、删除等操作非常频繁时,将 会降低数据库性能。因为每次的动作都可能会触发两倍甚至会降低数据库性能。因为每次的动作都可能会触发两倍甚至 两倍以上的成本来完成索引操作。两倍以上的成本来完成索引操作。 18.2 18.2 利用约束保持数据完整性利用约束保持数据完整性 数据完整性(数据完整性(Data Integrity)是指数据的精确性()是指数据的精确性( Accuracy)和可靠性()和可靠性(Reliability)。它是应防止数据库)。它是应防止数据库 中存在不符合语义规定的数据和防止因错误信息的输入造成
18、中存在不符合语义规定的数据和防止因错误信息的输入造成 无效操作或错误信息而提出的。约束是数据库中重要的对象无效操作或错误信息而提出的。约束是数据库中重要的对象 之一,使用约束的目的就是保证数据完整性。之一,使用约束的目的就是保证数据完整性。 18.2.1 18.2.1 数据库完整性的重要性数据库完整性的重要性 数据库中的数据庞攀复杂,各表之间的关系也可能数据库中的数据庞攀复杂,各表之间的关系也可能 存在着这样那样的关系。无论是通过人工录入还是自动生成存在着这样那样的关系。无论是通过人工录入还是自动生成 都不可避免地破坏数据完整性。例如,可能出现无客户信息都不可避免地破坏数据完整性。例如,可能出
19、现无客户信息 的订单,也可能出现订单数量不符合实际情况。数据库作为的订单,也可能出现订单数量不符合实际情况。数据库作为 基础性数据,对于这样的错误是不能容忍的,基础性数据,对于这样的错误是不能容忍的,而依靠人工维而依靠人工维 护数据完整性则是不现实的。因此,约束成为保证数据完整护数据完整性则是不现实的。因此,约束成为保证数据完整 性的重要手段。性的重要手段。 18.2.2 18.2.2 保持数据库完整性的重要方面保持数据库完整性的重要方面 1实体完整性实体完整性 实体完整性指表中行的完整性。要求表中的所有行都有唯一的标识符实体完整性指表中行的完整性。要求表中的所有行都有唯一的标识符 ,存储标识
20、符的列称为主键列。,存储标识符的列称为主键列。 2参照完整性参照完整性 参照完整性用于表述表之间的关系。这种关系一般表现为主从关系。参照完整性用于表述表之间的关系。这种关系一般表现为主从关系。 附表中的数据依附于主表数据的存在而存在。例如,对于客户表与订单表,客户附表中的数据依附于主表数据的存在而存在。例如,对于客户表与订单表,客户 表为主表,而订单表为附表。订单表中不可能存在某张订单,该订单的客户不在表为主表,而订单表为附表。订单表中不可能存在某张订单,该订单的客户不在 客户表中。如果要删除某个客户,那么该客户的订单也应该随之删除。客户表中。如果要删除某个客户,那么该客户的订单也应该随之删除
21、。 3域完整性域完整性 域完整性是对数据表中列属性的约束,如数据类型、格式、值域范围域完整性是对数据表中列属性的约束,如数据类型、格式、值域范围 、是否允许空值等约束。域完整性也与实际的逻辑相联系。例如,针对订单的到、是否允许空值等约束。域完整性也与实际的逻辑相联系。例如,针对订单的到 货日期,对应列值不能为空。货日期,对应列值不能为空。 4用户自定义完整性用户自定义完整性 前三种的约束都是由数据库自动完整的,而用户定义完整性则是由用前三种的约束都是由数据库自动完整的,而用户定义完整性则是由用 户自定义的约束。这极大增强了数据库的约束的灵活性。例如,针对订单状态只户自定义的约束。这极大增强了数
22、据库的约束的灵活性。例如,针对订单状态只 能存在能存在“有效有效”和和“无效无效”两种。两种。 18.2.3 18.2.3 利用约束保持数据完整性利用约束保持数据完整性 1保证实体完整性保证实体完整性 保证实体完整性一般使用主键实现。一旦创建主键保证实体完整性一般使用主键实现。一旦创建主键 ,主键将能够唯一标识一条记录。需要注意的是,主键值不,主键将能够唯一标识一条记录。需要注意的是,主键值不 能为空,因为利用能为空,因为利用select * from table_name where priermay_key = NULL是无法获得任何记录的。另外,主是无法获得任何记录的。另外,主 键可以是
23、多个列的组合,只要这些列的组合值唯一,同样可键可以是多个列的组合,只要这些列的组合值唯一,同样可 以保证实体完整性。以保证实体完整性。 2保证参照完整性保证参照完整性 参照完整性一般通过外键约束来实现。外键约束定参照完整性一般通过外键约束来实现。外键约束定 位于表之间的关系,而且强制实现由子表向主表的对应。这位于表之间的关系,而且强制实现由子表向主表的对应。这 在很大程度上解放了开发者通过复杂的逻辑来保证参照完整在很大程度上解放了开发者通过复杂的逻辑来保证参照完整 性。性。 18.2.3 18.2.3 利用约束保持数据完整性利用约束保持数据完整性 3保证域完整性保证域完整性 这里的域实际指的是
24、数据表的列。最常见的域约束为非这里的域实际指的是数据表的列。最常见的域约束为非 空约束和默认值约束。空约束和默认值约束。 非空约束是指,针对表中某列数据不能为非空约束是指,针对表中某列数据不能为NULL。值得注。值得注 意的是,在意的是,在Oracle 9i之后,之后,NULL与空字符串都被当做与空字符串都被当做NULL进行进行 处理,因此,将不能使用空字符串来填充非空列。非空约束是非处理,因此,将不能使用空字符串来填充非空列。非空约束是非 常有意义的,例如,对于货运订单,需要限制其到货日期不能为常有意义的,例如,对于货运订单,需要限制其到货日期不能为 空。即可针对该列使用非空约束。对于某列使
25、用非空约束,可以空。即可针对该列使用非空约束。对于某列使用非空约束,可以 在列声明时,添加在列声明时,添加not null选项。选项。 create table purchase_order (purchase_order_id integer primary key, goods_name varchar2(20), status varchar2(3), receive_date date not null) 4保证用户自定义完整性保证用户自定义完整性 用户自定义完整性一般通过检查约束来实现。检查约束用户自定义完整性一般通过检查约束来实现。检查约束 可以灵活定制检查条件,这正符合了用户自定
26、义完整性的要求。可以灵活定制检查条件,这正符合了用户自定义完整性的要求。 18.3 18.3 本章实例本章实例 一旦在数据表的某个或某些列上建立了索引,那么一旦在数据表的某个或某些列上建立了索引,那么 查询时也不一定能够使用。本节通过几个实例查看索引使用查询时也不一定能够使用。本节通过几个实例查看索引使用 时的误区。时的误区。 18.3.1 18.3.1 使用比较运算符不当使用比较运算符不当 Oracle是通过比较索引值来实现搜索的,但是,如是通过比较索引值来实现搜索的,但是,如 果使用了不当的比较运算符,有可能仍会使用全表扫描。果使用了不当的比较运算符,有可能仍会使用全表扫描。 select
27、 * from test_objects where object_name PEOPLE; 在在PL/SQL Developer中查看执行计划。中查看执行计划。 18.3.2 18.3.2 函数的使用函数的使用 对于索引列,一旦使用了函数,那么将在查询时无对于索引列,一旦使用了函数,那么将在查询时无 法使用索引。法使用索引。 select * from test_objects where instr(object_name, _) = 0 18.3.3 18.3.3 联合索引联合索引 索引不仅可以建立在单列之上,而且可以建立在多索引不仅可以建立在单列之上,而且可以建立在多 列之上。建立在多列之上的索引被称为联合索引。使用联合列之上。建立在多列之上的索引被称为联合索引。使用联合 索引列中的部分列作为查询条件,有可能无法使用到联合索索引列中的部分列作为查询条件,有可能无法使用到联合索 引所带来的性能提升。引所带来的性能提升。 在表在表test_objects的的object_type, owner, status列列 上建立联合索引。上建
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 5《自己的事情自己做》 教学设计-2024-2025学年心理健康(1、2年级)粤教版
- 23月迹(教学设计)-2024-2025学年统编版语文五年级上册
- 九年级化学上册 3.2 溶液组成的定量表示教学设计1 (新版)鲁教版
- 2023六年级英语下册 Unit 3 Who's That Man第1课时教学设计 陕旅版(三起)
- 2023九年级数学上册 第2章 一元二次方程2.1 一元二次方程教学设计 (新版)湘教版
- 18 文言文二则 囊萤夜读(教学设计)-2023-2024学年统编版语文四年级下册
- 清洁安全培训
- Unit 4 school days further study教学设计 -2024-2025学年译林版七年级英语上册
- Unit 5 The colourful world Part A Letters and sounds大单元整体教学设计表格式-2024-2025学年人教PEP版(2024)英语三年级上册
- 《第三单元 欣赏 春江花月夜》教学设计 -2023-2024学年初中音乐人教版七年级下册
- 合同管理知识培训课件
- 2025年-浙江建筑安全员A证考试题库附答案
- 2025届山西省高三一模地理试题(原卷版+解析版)
- 八下历史第三单元大单元教学设计
- 2024年电信销售员工年终总结
- 2025年度执业药师职务聘用协议模板
- Unit3 Weather Part A(说课稿)-2023-2024学年人教PEP版英语四年级下册
- 《明清家居家具设计》课件
- 2025年高考政治一轮复习知识清单必修四《哲学与文化》重难点知识
- 12万吨年丁二烯抽提装置、10-3万吨年MTBE-丁烯-1装置总承包工程施工组织设计
- 可填充颜色的地图(世界、中国、各省份)
评论
0/150
提交评论