1、的性能优化的性能优化本章学习目标本章学习目标 本章将介绍优化和调整数据库系统的本章将介绍优化和调整数据库系统的一些相关命令和方法。一些相关命令和方法。第九章第九章 的性能优化的性能优化本章内容安排本章内容安排 ()调整数据结构的设计。()调整应用程序结构设计。()调整数据库语句。()调整服务器内存分配。()调整硬盘,这一步是在信息系统开发之前完成的。()调整操作系统参数。 数据库性能优化的内容数据库性能优化的内容在线事务处理信息系统()在线事务处理信息系统() 这种类型的信息系统一般需要有大量的、操作。系统这种类型的信息系统一般需要有大量的、操作。系统需要保证数据库的并发性、可靠性和最终用户的
2、速度,这类系需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的数据库需要主要考虑下述因素或参数:统使用的数据库需要主要考虑下述因素或参数:()数据库回滚段是否足够?()数据库回滚段是否足够?()是否需要建立数据库索引、聚集、散列?()是否需要建立数据库索引、聚集、散列?()系统全局区()大小是否足够?()系统全局区()大小是否足够?()语句是否高效?()语句是否高效? 不同类型系统的优化不同类型系统的优化数据仓库系统(数据仓库系统( )这种信息系统的主要任务是从的海量数据中进行查询,得这种信息系统的主要任务是从的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型
3、的到数据之间的某些规律。数据库管理员需要为这种类型的数据库着重考虑下述因素或参数:数据库着重考虑下述因素或参数:()是否采用()是否采用* *索引或者索引?索引或者索引?()是否采用并行查询以提高查询效率?()是否采用并行查询以提高查询效率?()是否采用函数编写存储过程?()是否采用函数编写存储过程?()是否有必要建立并行数据库,来提高数据库的查询效()是否有必要建立并行数据库,来提高数据库的查询效率。率。 语句的优化 语句的优化规则 ()去掉不必要的大表、全表扫描。不必要的大表、全表扫描会造成不必要的输入输出,而且还会拖垮整个数据库;()检查优化索引的使用 这对于提高查询速度来说非常重要;(
4、)检查子查询,考虑子查询是否可以用简单连接的方式进行重新书写;()调整和等存储参数优化插入、更新或者删除等操作;()考虑数据库的优化器;()考虑数据表的全表扫描和在多个的情况下考虑并行查询。索引的使用索引的使用语句排序优化语句排序优化. . 选择联合查询的联合次序选择联合查询的联合次序 语句优化的具体方法子查询的调整子查询的调整 、索引的使用、索引的使用()尽量使用索引()尽量使用索引 是全表扫描还是索引范围扫描主要考虑的查询速度问是全表扫描还是索引范围扫描主要考虑的查询速度问题。试比较下面两条语句:题。试比较下面两条语句:语句:语句: ( );语句:语句: ( ); ()索引不起作用的情况存
5、在数据类型隐形转换列上有数学运算使用不等于()运算使用字符串函数通配符在第一个字符字符串连接() ()函数的索引例如,日期类型是经常用到的,而且在语句中会使用函数以查询具体的的范围日期。如: * (,);可以建立基于函数的索引如: (,);语句排序优化语句排序优化排序发生的情况如下:排序发生的情况如下:中包含中包含 子句子句 中包含中包含 子句子句 中包含中包含 子句子句 中包含中包含 或或 操作操作选择联合查询的联合次序选择联合查询的联合次序 联合查询中如涉及到多个表的字段关联及查询,联合查询中如涉及到多个表的字段关联及查询,其查询语句联合次序的不同写法,会导致语句对各表具体其查询语句联合次
6、序的不同写法,会导致语句对各表具体操作的步骤有不同的次序,所以虽然执行结果相同,但执操作的步骤有不同的次序,所以虽然执行结果相同,但执行效率却不同。行效率却不同。 子查询的调整()关联子查询和非关联子查询 非关联查询的开销非关联查询时子查询只会执行一次,而且结果是排序好的,并保存在一个的临时段中,其中的每一个记录在返回时都会被父查询所引用。在子查询返回大量的记录的情况下,将这些结果集排序,以及将临时数据段进行排序会增加大量的系统开销。 关联查询的开销对返回到父查询的记录来说,子查询会每行执行一次。因此,必须保证任何可能的时候子查询用到索引。()在子查询中慎重使用或者 语句 在子查询中慎重使用或
7、者 语句,使用 ()的效果要好的多。带的关联子查询是多余的,因为子句和子查询中相关的操作的功能是一样的。为非关联子查询指定子句是不适当的,因为这样会产生笛卡尔乘积。尽量不要使用 子句。()慎重使用视图的联合查询 慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。 可以在参数文件中设置参数,这个参数在共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的程序包。 运行环境的优化 内存参数的调整主要是指数据库的系统全局区()的调整。主要由三部分构成:共享池、数据缓冲区、日志缓冲区。共享池 共享池由两部分构成:共享区和数据字
8、典缓冲区。共享区是存放用户命令的区域,数据字典缓冲区存放数据库运行的动态信息。 内存结构的调整()数据库管理员通过执行下述语句,来查看共享区的使用率。 ()() $; 共享区的使用率应该在以上,否则需要增加共享池的大小。()数据库管理员可以执行下述语句,查看数据字典缓冲区的使用率。 ()() $; 数据字典缓冲区的使用率也应该在以上,否则需要增加共享池的大小。 数据缓冲区数据缓冲区 数据库管理员可以通过下述语句,来查看数据库数据缓冲数据库管理员可以通过下述语句,来查看数据库数据缓冲区的使用情况。区的使用情况。 , $ $ ( , , , , ); ; 根据查询出来的结果可以计算出数据缓冲区的使
9、用命中率:根据查询出来的结果可以计算出数据缓冲区的使用命中率:数据缓冲区的使用命中率数据缓冲区的使用命中率 ( ( )( ( )这个命中率应该在以上,否则需要增加数据缓冲区的大小。这个命中率应该在以上,否则需要增加数据缓冲区的大小。日志缓冲区日志缓冲区 数据库管理员可以通过执行下述语句,查看日志缓冲数据库管理员可以通过执行下述语句,查看日志缓冲区的使用情况。区的使用情况。 $ ( , );$ ( , );根据查询出的结果可以计算出日志缓冲区的申请失败率:根据查询出的结果可以计算出日志缓冲区的申请失败率:申请失败率申请失败率申请失败率应该接近于,否则说明日志缓冲区开设太小,需申请失败率应该接近于
10、,否则说明日志缓冲区开设太小,需要增加数据库的日志缓冲区。要增加数据库的日志缓冲区。()在磁盘上建立数据文件前首先运行磁盘碎片整理程序 为了安全地整理磁盘碎片,需关闭打开数据文件的实例,并且停止服务。如果有足够的连续磁盘空间建立数据文件,那么就很容易避免数据文件产生碎片。()不要使用磁盘压缩 数据文件不支持磁盘压缩。()不要使用磁盘加密 加密象磁盘压缩一样增加了一个处理层,降低磁盘读写速度。如果担心自己的数据可能泄密,可以使用包和 选择性地加密数据的敏感部分。 物理的调整()使用 的使用应注意:选择硬件超过软件;日志文件不要放在 卷上,因为 读性能高而写性能差;把日志文件和归档日志放在与控制文
11、件和数据文件分离的磁盘控制系统上。()分离页面交换文件到多个磁盘物理卷 跨越至少两个磁盘建立两个页面文件。可以建立四个页面文件并在性能上受益,确保所有页面文件的大小之和至少是物理内存的两倍。查看的使用情况查看的使用情况 使用操作命令可以看到的使用情况,一般操作系统使用操作命令可以看到的使用情况,一般操作系统的服务器,可以使用的服务器,可以使用 命令查看的使用率;操作系统的服命令查看的使用率;操作系统的服务器,可以使用的性能管理器来查看的使用率。务器,可以使用的性能管理器来查看的使用率。 出现资源不足的情况是很多的:语句的重解析、低效出现资源不足的情况是很多的:语句的重解析、低效率的语句、锁冲突
12、都会引起资源不足。率的语句、锁冲突都会引起资源不足。 的优化调整查看语句的解析情况查看语句的解析情况()数据库管理员可以执行下述语句来查看语句的解析情况:()数据库管理员可以执行下述语句来查看语句的解析情况: * * $ (, ); $ (, );这里:这里:是系统服务时间。:是系统服务时间。:是响应时间。:是响应时间。而用户等待时间为:而用户等待时间为: 由此可以得到用户语句平均解析等待时间:由此可以得到用户语句平均解析等待时间:用户语句平均解析等待时间用户语句平均解析等待时间()数据库管理员还可以通过下述语句,查看低效率的语句: $;优化这些低效率的语句也有助于提高的利用率。查看数据库的冲
13、突情况查看数据库的冲突情况 数据库管理员可以通过数据库管理员可以通过$ $数据字典中的数据字典中的“ ”“ ”统计统计项查看数据库的冲突情况,如果没有冲突的话,项查看数据库的冲突情况,如果没有冲突的话, 查询出查询出来没有结果。如果冲突太大的话,数据库管理员可以降来没有结果。如果冲突太大的话,数据库管理员可以降低参数值,来消除高的使用率。低参数值,来消除高的使用率。 的优化调整方法的优化调整方法 一些优化使用和配置的具体方法有:一些优化使用和配置的具体方法有:()取消屏幕保护。()取消屏幕保护。()把系统配置为应用服务器。()把系统配置为应用服务器。()监视系统中消耗中断的硬件。()监视系统中
14、消耗中断的硬件。()保持最小的安全审计记录。()保持最小的安全审计记录。()在专用服务器上运行。()在专用服务器上运行。()禁止非必须的服务。()禁止非必须的服务。 网络配置是性能调整的一项很重要的内容,而且很容易隐藏性能瓶颈。()配置网卡使用最快速度和有效模式()删除不需要的网络协议()优化网络协议绑定顺序()为禁止或优化文件共享 网络配置的优化碎片是如何产生的碎片对系统的影响()导致系统性能减弱()浪费大量的表空间 碎片整理自由范围的碎片计算自由范围的碎片计算 用用 (自由空间碎片索引)值来直观体现:(自由空间碎片索引)值来直观体现:* *()()()()* *()()自由范围的碎片整理自
15、由范围的碎片整理 可以将表空间的缺省存储参数改为非。一般将其设为,可以将表空间的缺省存储参数改为非。一般将其设为,如:如: ( );( ); 这样便会将自由范围自动合并,达到碎片整理的目的。这样便会将自由范围自动合并,达到碎片整理的目的。 也可以采用如下语句,通过手工合并自由范围来达到也可以采用如下语句,通过手工合并自由范围来达到碎片整理的目的。碎片整理的目的。 ; ;段的碎片整理段的碎片整理 段由范围组成,在有些情况下,有必要对段的碎片进行整段由范围组成,在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典,范围的信息可查理。要查看段的有关信息,可查看数据字典,范围的信
16、息可查看数据字典。如果段的碎片过多,看数据字典。如果段的碎片过多, 将其数据压缩到一个范围的将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用(输入中的数据插入到新表,同时删除旧表。这个过程可以用(输入输出)工具来完成。输出)工具来完成。 ()命令有一个(压缩)标志,这个标志在读表时会引()命令有一个(压缩)标志,这个标志在读表时会引发确定该表所分配的物理空间量,它会向输出转储文件写入一发确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数,等于
17、全部所分配空间。若这个表关闭,个新的初始化存储参数,等于全部所分配空间。若这个表关闭, 则使用()工具重新生成。这样,它的数据会放入一个新的、则使用()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:较大的初始段中。例如: ();();若输出成功,则从库中删除已输出的表,然后从输出转储文件若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:中输入表: ; ;这种方法可用于整个数据库。这种方法可用于整个数据库。另外,应该定期另外,应该定期 ,从而清理碎片。,从而清理碎片。 系统参数的调整 (共享池和(共享池和 )共享池调整的技巧主要有:共享池调整的技巧主要有:()刷
18、共享池()刷共享池刷(刷( )共享池可以使小块的内存合并为大块的内存。当共享池)共享池可以使小块的内存合并为大块的内存。当共享池的碎片过多时,能够暂时恢复性能。刷共享池可以使用语句:的碎片过多时,能够暂时恢复性能。刷共享池可以使用语句: ;()绑定变量()绑定变量 (数据库缓存调整)(数据库缓存调整)从缓存调整的角度看,应力求避免以下的问题:从缓存调整的角度看,应力求避免以下的问题:()()“缓存的最近最少使用()链缓存的最近最少使用()链”( )的加锁竞争;)的加锁竞争;()()“平均写队列平均写队列”( )长度过大;)长度过大;()过多时间花在等待()过多时间花在等待“写完毕等待上写完毕等
19、待上”( ););()过多时间花在等待()过多时间花在等待“缓冲释放等待缓冲释放等待”上(上( )。)。 (加锁或插销竞争)(加锁或插销竞争) 插销加锁是中保护共享数据结构的低层的串行化机制。插插销加锁是中保护共享数据结构的低层的串行化机制。插销是一类可以非常快的获得和释放的锁。插销锁的实现是依销是一类可以非常快的获得和释放的锁。插销锁的实现是依赖于操作系统的,尤其在关于一个进程是否会等待一个锁,赖于操作系统的,尤其在关于一个进程是否会等待一个锁,和等多久方面。和等多久方面。有如下的锁(插销)需要调整:有如下的锁(插销)需要调整:()() :重写日志的复制分配插销:重写日志的复制分配插销()(
20、) :共享池的插销:共享池的插销()() : 插销插销 (重写日志缓冲的调整)(重写日志缓冲的调整) 将重写日志缓冲中的重写项写到重写日志文件中。一旦将这将重写日志缓冲中的重写项写到重写日志文件中。一旦将这些项复制到重写日志文件中,用户进程就可以重写这些项。统些项复制到重写日志文件中,用户进程就可以重写这些项。统计项目计项目“ ”反映了用户进程等待重写日志缓冲中空间的时间的反映了用户进程等待重写日志缓冲中空间的时间的数字。数字。()设置重写日志大小的提示:()设置重写日志大小的提示:“ ”的值应该接近。的值应该接近。()设定合适的重写日志的大小,建议每分钟进行一次重写日()设定合适的重写日志的
21、大小,建议每分钟进行一次重写日志的切换。志的切换。 (查询效率的调整)(查询效率的调整) 如果查询运行得很慢,请考虑以下这些方面:如果查询运行得很慢,请考虑以下这些方面:()希望这个查询运行的有多快以及有理由这样要求吗?()希望这个查询运行的有多快以及有理由这样要求吗?()优化模式()优化模式 设为何值?设为何值?()查询涉及的索引都是有效的吗?()查询涉及的索引都是有效的吗?()在数据库中有没有其他的长时间运行的查询(大查询)。()在数据库中有没有其他的长时间运行的查询(大查询)。()表和索引上有统计信息吗?()表和索引上有统计信息吗?()统计信息是被计算出来的还是被估计出来的?()统计信息
22、是被计算出来的还是被估计出来的?对于查询的性能调整有两个主要的调试工具:和。对于查询的性能调整有两个主要的调试工具:和。 (临时表空间的调整)(临时表空间的调整) 临时表空间的调整的技巧如下:临时表空间的调整的技巧如下: 如果即使在稳定的状态下也存在很多的排序扩展锁(如果即使在稳定的状态下也存在很多的排序扩展锁( )的)的竞争,应该通过修改临时表空间的竞争,应该通过修改临时表空间的 子句的值来增大扩展块的大子句的值来增大扩展块的大小。如果存在很多的排序扩展锁(小。如果存在很多的排序扩展锁( )的竞争并且这种等待是由)的竞争并且这种等待是由于过多的并发的排序造成的,应该增大参数的大小,以使更多于
23、过多的并发的排序造成的,应该增大参数的大小,以使更多的排序能保存在内存中。的排序能保存在内存中。建议让扩展块的大小和参数相同。建议让扩展块的大小和参数相同。 并发事件处理 数据库是一个共享资源,可为多个应用程序所共享。这些程序可串行运行,但在许多情况下,可能多个程序或一个程序的多个进程并行地运行,这就是数据库的并行操作。在多用户数据库环境中,多个用户程序可并行地存取数据库,如果不对并发操作进行控制,会存取不正确的数据,或破坏数据库数据的一致性。 并发事件的产生()当一个用户正在修改表中数据的同时,另一个用户正试图删除该表。()用户正试图读取用户的某个事务中的一些数据,在用户的事务开始后,该事务
24、由用户修改和提交。用户读取用户提交的数据。这意味着在同一个事务中读取的数据在某个时刻不一致。()某个用户对数据进行修改,另一个用户在第一个用户提交事务以前对同一行进行修改;因此,第一个用户所做的改变丢失了。()一个用户从另一个用户尚未提交的数据中读取数据;也就是说,在用户的改变提交以前,用户读取用户正在修改的行。 锁锁的功能锁的功能 锁的类型锁的类型 锁的模式锁的模式 查看相关信息查看相关信息 锁的功能锁的功能()数据一致性()数据一致性()数据并行性()数据并行性()数据完整性()数据完整性在两个不同级上提供读一致性:语句级读一致性和事务级一致性。()语句级读取一致性()事务级读取一致性锁的
25、类型锁的类型锁具体分为以下几类:锁具体分为以下几类:()自动锁与显示锁()自动锁与显示锁按用户与系统划分,可以分为自动锁与显示锁。按用户与系统划分,可以分为自动锁与显示锁。自动锁:当进行一项数据库操作时,缺省情况下,系统自动自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。为此数据库操作获得所有有必要的锁。显示锁:某些情况下,需要用户显示的锁定数据库操作要用显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。据库对象设定的。()共享锁与
26、排它锁按锁级别划分,可分为共享锁与排它锁。共享锁:共享锁允许相关资源可以共享,几个用户可同时读同一数据,几个事务可在同一资源上获取共享封锁。共享锁比排它锁具有更高的数据并行性。但拙劣的事务设计共享锁容易造成死锁或数据更新丢失。排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。排它锁禁止相关资源的共享,如果一事务以排它方式封锁一资源,仅仅该事务可更改该资源,直至释放排它封锁。()锁和锁按操作划分,可分为锁、锁。锁又可以分为:行锁、表锁、死锁。 行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。 表锁:当事务
27、获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用 语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用 显示的定义。 死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。锁又可以分为:排它锁、共享锁、分析锁。排它锁:创建、修改、删除一个数据库对象的语句获得操作对象的排它锁。如使用 语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它锁。共享锁:需在数据库对象之间建立相互依赖关系的语句通常需共享获得锁。如创建一个包,该包中的过程与函数引用了不同的数据库
28、表,当编译此包时,该事务就获得了引用表的共享锁。分析锁:使用共享池存储分析与优化过的语句及程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的锁类型,使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,使共享池中的对象作废,下次在引用这条语句时,重新分析编译此语句。()内部闩锁内部闩锁是中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。锁的模式锁的模式()模式:。()模式:。()模式
29、:()模式: 空。级锁有:,有时会在空。级锁有:,有时会在$ $出现。出现。()模式:()模式: 行共享():共享表锁,行共享():共享表锁, 。级锁有:。级锁有: 、 、 。 当对话使用当对话使用 子串打开一个游标时,所有返回集中的数据行都子串打开一个游标时,所有返回集中的数据行都将处于行级()独占式锁定,其他对象只能查询这些数据行,将处于行级()独占式锁定,其他对象只能查询这些数据行,不能进行、或不能进行、或 操作。操作。()模式: 行独占():用于行的修改, 。级锁有:、 。没有之前插入同样的一条记录会没有反应, 因为后一个的锁会一直等待上一个的锁,必须释放掉上一个才能继续工作。()模式
30、: 共享锁():阻止其他操作,。级锁有: 、 。为、不影响(、等)操作, 但(、等)操作会提示错误。()模式: 共享行独占():阻止其他事务操作, 。级锁有: 。具体来讲有主外键约束时 . ; 可能会产生,的锁。()模式: 独占():独立访问使用,。级锁有: 、 、 、 、 。数字越大锁级别越高, 影响的操作越多。查看相关信息查看相关信息 在动态状态表在动态状态表$ $中存储与数据库中的锁有关的所有中存储与数据库中的锁有关的所有信息。当资源被锁定时,信息。当资源被锁定时, 可以检查可以检查$ $表,查看数据库中的表,查看数据库中的各种情况。各种情况。 数据完整性 数据完整性是指数据的正确性和相
31、容性。数据的完整性是为了防止数据库存在不符合原义的数据,防止错误信息输入和输出,即数据要遵守由或应用开发者所决定的一组预定义的规则。数据完整性的类型数据完整性的类型 应用于关系数据库的表的数据完整性有下列类型:应用于关系数据库的表的数据完整性有下列类型:()在插入或修改表的行时允许不允许包含有空值的列,称为()在插入或修改表的行时允许不允许包含有空值的列,称为空与非空规则。空与非空规则。()唯一列值规则,允许插入或修改的表行在该列上的值唯一。()唯一列值规则,允许插入或修改的表行在该列上的值唯一。()引用完整性规则,同关系模型定义相符。()引用完整性规则,同关系模型定义相符。()用户对定义的规
32、则,是复杂的完整性检查。()用户对定义的规则,是复杂的完整性检查。完整性约束及其优点完整性约束及其优点 完整性约束,是对表的列定义规则的说明性方法。完整性约束,是对表的列定义规则的说明性方法。 利用完整性约束机制防止无效的数据进入数据库的利用完整性约束机制防止无效的数据进入数据库的基表,如果任何执行结果破坏完整性约束,该语句被回滚基表,如果任何执行结果破坏完整性约束,该语句被回滚并返回上一个错误。并返回上一个错误。 利用完整性约束实施数据完整性规则有下列优点:()定义或更改表时,不需要程序设计,便很容易地编写程序并可消除程序性错误,其功能是由控制。所以说明性完整性约束优于应用代码和数据库触发器
33、。()对表所定义的完整性约束是存储在数据字典中,所以由任何应用进入的数据都必须遵守与表相关联的完整性约束。()具有最大的开发能力。当由完整性约束所实施的事务规则改变时,管理员只需改变完整性约束的定义,所有应用自动地遵守所修改的约束。完整性约束的类型完整性约束的类型 的和应用开始者对列的值输入可使用的完整性约束有的和应用开始者对列的值输入可使用的完整性约束有下列类型:下列类型:()() 约束:如果在表的一列的值不允许为空,则需在该列指约束:如果在表的一列的值不允许为空,则需在该列指定定 约束。约束。()键约束:在表指定的列或组列上不允许两行具有重复值时,()键约束:在表指定的列或组列上不允许两行
34、具有重复值时,则需要该列或组列上指定键完整性约束。在键约束定义中的列则需要该列或组列上指定键完整性约束。在键约束定义中的列或组列称为唯一键。所有唯一完整性约束是用索引方法实施。或组列称为唯一键。所有唯一完整性约束是用索引方法实施。()() 约束:在数据库中每一个表可有一个约束:在数据库中每一个表可有一个 约束。包含在约束。包含在 完完整性约束的列或组列称为主键,每个表可有一个主键。使用索整性约束的列或组列称为主键,每个表可有一个主键。使用索引实施引实施 约束。约束。 () 约束:在关系数据库中表可通过公共列相关联,该规则控制必须维护的列之间的关系。包含在引用完整性约束定义的列或组列称为外来键。
35、由外来键所引用的表中的唯一键,称为引用键。包含有外来键的表称为子表或从属表。由子表的外来键所引用的表称为双亲表或引用表。如果对表的每一行,其外来键的值必须与主键中一值相匹配,则需指定引用完整性约束。()约束:表的每行对一指定的条件必须是或未知,则需在一列或列组上指定完整性约束。如果在发出一个语句时,约束的条件计算得时,该语句被回滚。 数据库触发器数据库触发器 数据库触发器,是使用非说明方法实施完整性数据库触发器,是使用非说明方法实施完整性规则,利用数据库触发器可定义和实施任何类型的完规则,利用数据库触发器可定义和实施任何类型的完整性规则。整性规则。 数据库性能优化工具常用的数据库性能优化工具有
36、:常用的数据库性能优化工具有:()数据库在线数据字典()数据库在线数据字典()操作系统工具()操作系统工具()语言跟踪工具()语言跟踪工具( )()() ()()()() 语言优化命令语言优化命令 常见问题处理 ()序号生成的命令格式为: 序号名 每次增长数 起始序号()可以用下面的语句得到当前的序号: ;()也可以用下面的语句得到下一个序号: (,.); 序号生成器()删除序号的语句为: ;()影响的初始化参数: 设置能同时被的数目自关联查询方法自关联查询方法 查询方法查询方法 确定数据库表中重复的记录 子句子句自关联查询方法自关联查询方法 系统中,对于所有的表都存在一个唯一的列,这就系统中
37、,对于所有的表都存在一个唯一的列,这就是。对该列使用最大()或者最小()函数可以非常容易是。对该列使用最大()或者最小()函数可以非常容易地确定重复的行。地确定重复的行。 查询方法查询方法 利用分组函数利用分组函数 也很容易确定重复的行。以需要也很容易确定重复的行。以需要创建唯一索引的列分组并统计每组的个数,很明显如果创建唯一索引的列分组并统计每组的个数,很明显如果组中记录数超过个就存在重复的行。组中记录数超过个就存在重复的行。3 3Exception intoException into子句子句 采用alter table命令中的Exception into子句也可以确定出表中重复的记录。这种方法稍微麻烦一些,为了使用“excepeion into”子句,必须首先创建EXCEPTIONS表。创建该表的SQL脚本文件为utlexcpt.sql。对于NT系统和UNIX系统,Oracle存放该文件的位置稍有不同。 将exceptions表和原表通过rowid关联起来即可得到原表中重复的记录。