希赛软件开发公司为某大型国企建立一个数据库应用系统(采用Oracle数据库)。尽管配置了比较良好的硬件和网络环境,但该数据库应用系统实施后的整体性能表现较差。特别是随着业务量与信息量的迅速扩大,数据库系统的存取速度显著减慢,存储效率也明显下降。
该企业通过反复实践与摸索,并邀请数据库专家一起会诊,认为可以从以下4个方面进一步优化数据库应用系统。
(1)由于数据库应用中最主要的查询与修改数据操作大多需通过I/O来完成的,因此需要通过调整服务器配置(即对硬件设备进行升级)、操作系统配置与数据库管理系统的有关参数,优化系统的I/O性能,尤其是改进磁盘I/O的效率与性能。
(2)优化“索引”的建立与使用机制,尽可能提高数据查询的速度或效率。
(3)合理使用聚类(Cluster),改进查询响应时间和系统的综合性能。其中,“聚类”是指把单独组织的,但在逻辑上经常需连接的,较为稳定的几个基本表聚集在一起(在物理上实现邻近存放),可以显著减少数据的搜索时间,从而提高性能。
(4)对应用系统中使用的SQL语句进行调优,针对每条SQL语句都建立对应的索引等。
【问题1】(4分)
许多开发技术人员由于缺乏经验,通常在建立实体(如基本表、索引或表空间等)时,都习惯于使用DBMS提供的“缺省参数”,结果常常会引起数据库应用系统性能较差的隐患。结合你的系统架构设计经验,请用200字以内文字简要说明使用DBMS默认参数的缺点。
【问题2】(4分)
该企业所邀请的数据库专家的会诊建议中,选取合适的“索引字段”,对于索引实现的效率具有相当重要的作用。结合你的系统架构设计经验,请用200字以内的文字,指出选用具有哪些特征的字段作为索引手段较为合适。
【问题3】(10分)
(1)该企业所邀请的数据库专家会诊意见中,针对每条SQL语句都建立索引的建议是否合适?请简要说明理由。
(2)结合你的系统架构设计经验,请列举出4条SQL语句优化的基本策略。
【问题4】(7分)
在数据库中,当某个业务表中的数据量很大且急速膨胀时,为了保持较高的数据响应速度,可以对该数据表进行分片设计。请用300字以内的文字简要说明对数据表分片需要满足的条件,以及常见的数据表分片方法。
【问题1】
①使用默认参数:1、数据缓存分配不合理,造成系统查询缓慢;2、加锁数量、打开对象数量设置不合理,导致引发死锁;
②在合理分布各类存储空间时,由于默认参数导致记录分配不均匀,降低存储空间利用度
【问题2】
①该字段作为数据表中的主关键字或候选关键字。
②该字段能够唯一地标识记录或通过将记录进行较多细目分类。
③该字段与其他字段组合能唯一地标识记录或将记录进行分组。
④该字段是其他表的外键
【问题3】
(1)不适当
理由如下(包含但不限于以下内容,列举出其中4个小点即可,答案类似即可)。
①如果建立索引不当,数据库管理系统将不利用已经建立的索引,而采取全表扫描。
②当更新操作成为系统瓶颈,因为每次更新操作会重建表的索引,则需要考虑删除某些索引。
③应该针对不同应用情况选择适当的索引类型。例如,如果经常使用范围查询,则B树索引比散列索引更加高效。
④应该将有利于大多数数据查询和更新的索引设为聚类索引。
⑤需要对建立的索引进行实际的测试,因为索引的使用是由数据库管理系统(数据库优化器)决定的。
(2)SQL语句优化的常见策略如下(包含但不限于以下内容,列举出其中5个小点即可)。
①建立物化视图或尽可能减少多表查询。
②以不相干子查询替代相干子查询。
③只检索需要的列。
④用带IN的条件子句等价替换OR子句。
⑤经常提交COMMIT,以尽早释放锁。
⑥避免嵌套的游标(Cursor)和多重循环等。
【问题4】
数据表分片满足的条件
(1)完备性条件:必须把全局关系的所有数据映射到片段中,决不允许有属于全局关系的数据却未被映射到任何一个片段。
(2)可重构条件:必须保证能够由同一个全局关系的各个片段来重建该全局关系。
(3)不相交条件:要求一个全局关系被分割后所得的各个数据片段互不重叠。
数据表分片方法:水平分片和垂直分片。
【问题1】
目前,大多数的大、中型信息系统都使用数据库作为数据存储,而信息系统的性能优化是一个综合性的问题,需要综合考虑硬件设备、操作系统、数据库和应用系统。基于数据库的业务系统,一般在进行调优时,需要具体问题具体分析。全面的分析方案应该包括以下3方面内容。
(1)对系统中的业务数据进行搜集,判断当前硬件设备是否足够。判断数据库管理系统和操作系统的相应参数设置是否合理。例如数据库中SGA中的参数,操作系统中共享内存等参数、数据库中数据与索引物理存储的分离等。
(2)对应用系统进行分析,对业务系统的类型进行确认,如联机事务处理和数据仓库对数据库的要求差异很大。OLTP和OLAP的类型也有很大的差异。
(3)对应用系统中的SQL语句和索引等进行分析。
题干中数据库专家已指出,系统I/O经常会成为制约数据库应用系统性能的瓶颈。减少I/O资源的争用,以及合理分布各类存储空间,通常能有效地提高全系统的运行效率。例如,可以使应用系统的存储空间与系统表空间分离;在不同的盘驱动器上设立数据表空间与索引表空间;自动整理与减少空间碎片等。
使用DBMS默认参数,1、数据缓存分配不合理,造成系统查询缓慢;2、加锁数量、打开对象数量设置不合理,导致引发死锁。另外在合理分布各类存储空间时,由于默认参数导致记录分配不均匀,降低存储空间利用度。
【问题2】
对于大型数据库系统来说,索引机制可以在很大程度上提高数据查询的效率。但是索引是以空间为代价来换取时间的,而且一般仅当表的容量较大时,才能显现出索引的作用。通常,优化索引的使用有以下两条主要途径。
(1)尽可能充分地去理解索引的基本原理和在本系统中使用索引时的一些规则,从而为正确使用索引奠定基础。比如,在某些谓词后不使用索引(如OR、NOT IN等),查询的记录数超过表总记录数的20%以上时不适宜使用索引,在另一些谓词后出现的索引字段会使用索引等。
(2)在有很多基本表的场合下,由多名开发人员大量创建不尽合理的索引,可能会显著降低系统的性能。根据应用的实际需要,合理地创建“索引”,在本数据库应用系统中可以考虑一些创建索引的原则或指导性规则。例如,原则上,对记录数较多的表,应尽可能考虑创建索引的可行性;在连接多个表的场合下,最好考虑采用索引;无相同值的字段可建立起“唯一性索引”(这时查询代化性能特别出色);对于只读的表可建立较多的索引,对于更新频度较高的表只能建立较少的索引;尽可能在数据加载之后再建立索引,以避免重新索引的开销;建立并设置复合索引时,应把最常用的索引字段放在前面,即保持相对合理的索引字段次序。
选取合适的“索引字段”,对于索引实现的效率具有相当重要的作用。通常,选用具有以下特征的字段作为索引手段较为合适:①该字段作为数据表中的主关键字或候选关键字;②该字段能够唯一地标识记录或通过将记录进行较多细目分类;③该字段与其他字段组合能唯一地标识记录或将记录进行分组;④该字段是其他表的外键等。
【问题3】
该企业所邀请的数据库专家会诊意见中,针对每条SQL语句都建立索引的建议是不适当的。通常,针对查询语句,建立适当的索引以提高查询效率。但是索引调整时还需要考虑以下原则。
(1)如果更新操作成为系统瓶颈,因为每次更新操作会重建表的索引,则需要考虑删除某些索引。
(2)应该针对不同应用情况选择适当的索引类型。例如,如果经常使用范围查询,则B树索引比散列索引更加高效。
(3)将有利于大多数据查询和更新的索引设为聚类(Culster)索引。
同时需要对建立的索引进行实际的测试,因为索引的使用是由数据库管理系统(数据库优化器)决定的。如果建立索引不当,数据库管理系统将不利用已经建立的索引,而采取全表扫描。
SQL语句优化在信息系统调优中所占比例较大。通常,一个信息系统中不同SQL语句的数目往往在200~400条左右,在优化时,需要对每条SQL语句的性能进行测量,对性能表现不佳的SQL语句进行调整。当前也已经出现了专门的SQL语句优化的工具,可以辅助开发人员。SQL语句优化的常见策略如下。
(1)优化相应的表连接,建立物化视图或尽可能减少多表查询。
(2)以不相干子查询替代相干子查询,即优化嵌套子查询。
(3)只检索需要的列,无须将表中所有的列全部检索,即避免全表的反复查询。
(4)用带IN的条件子句等价替换OR子句。
(5)避免嵌套的游标(Cursor)和多重循环。
(6)经常提交COMMIT,以尽早释放锁等。
注意,对于不同类型的应用系统(类型划分根据对数据库的操作类型而言,例如OLTP等),在数据库操作中,可采用的优化方法也有所不同。
【问题4】
在数据库中,某个业务表中的数据量很大,急速膨胀,在这样的情况下,为了保持高的数据响应速度,根据数据的时间局部性和空间局部性原则,可以对数据表进行分片设计。一般有两种分片方法,分别为水平分片和垂直分片。
对数据表分片需要满足完备性条件、可重构条件和不相交条件。其中,完备性条件是指必须把全局关系的所有数据映射到片段中,决不允许有属于全局关系的数据却未被映射到任何一个片段。可重构条件是指必须保证能够由同一个全局关系的各个片段来重建该全局关系。对于水平分片可用并操作重构全局关系;对于垂直分片可用连接操作重构全局关系。不相交条件是指要求一个全局关系被分割后所得的各个数据片段互不重叠(对垂直分片的主键除外)。