评价系统的数据库优化查询设计
2010-10-27李北芳黑龙江建筑职业技术学院150008
李北芳 黑龙江建筑职业技术学院 150008
评价系统的数据库优化查询设计
李北芳 黑龙江建筑职业技术学院 150008
利用计算机对教学质量进行管理,是实现教学管理规范化和科学化的重要手段。本文以黑龙江省教育厅高职高专院校科学技术研究项目《高职院校教学质量评价系统软件的开发与应用》项目编号:11525049为例,介绍了教学质量评价系统数据库优化查询的设计。
数据库; 评价管理; 设计优化
一、引言
数据库是整个系统的核心,它的设计直接关系系统执行的效率和系统的稳定性。因此在软件系统开发中,数据库设计应遵循必要的数据库范式理论,以减少冗余、保证数据的完整性与正确性。只有在合适的数据库产品上设计出合理的数据库模型,才能降低整个系统的编程和维护难度,提高系统的实际运行效率。本文对教学质量评价系统的数据查询的优化进行探讨。
二、基于第三范式的基本表设技
在基于表驱动的信息管理系统(MIS)中,基本表的设计规范是第三范式(3NF)。第三范式的基本特征是非主键属性只依赖于主键属性。基于第三范式的数据库表设计具有很多优点:一是消除了冗余数据,节省了磁盘存储空间;二是有良好的数据完整性限制,即基于主外键的参照完整限制和基于主键的实体完整性限制,这使得数据容易维护,也容易移植和更新;三是数据的可逆性好,在做连接(Join)查询或者合并表时不遗漏、也不重复;四是因消除了冗余数据(冗余列),在查询(Select)时每个数据页存的数据行就多,这样就有效地减少了逻辑I/O,每个Cash存的页面就多,也减少物理I/O;五是对大多数事务(Transaction)而言,运行性能好;六是物理设计(Physical Design)的机动性较大,能满足日益增长的用户需求。
在基本表设计中,表的主键、外键、索引设计占有非常重要的地位,但系统设计人员往往只注重于满足用户要求,而没有从系统优化的高度来认识和重视它们。实际上,它们与系统的运行性能密切相关。现在从系统数据库优化角度讨论这些基本概念及其重要意义:
(1)主键(Primary Key):主键被用于复杂的SQL语句时,频繁地在数据访问中被用到。一个表只有一个主键。主键应该有固定值(不能为Null或缺省值,要有相对稳定性),不含代码信息,易访问。把常用(众所周知)的列作为主键才有意义。短主键最佳(小于25bytes),主键的长短影响索引的大小,索引的大小影响索引页的大小,从而影响磁盘I/O。主键分为自然主键和人为主键。自然主键由实体的属性构成,自然主键可以是复合性的,在形成复合主键时,主键列不能太多,复合主键使得Join*作复杂化、也增加了外键表的大小。人为主键是在没有合适的自然属性键、或自然属性复杂或灵敏度高时,人为形成的。人为主键一般是整型值(满足最小化要求),没有实际意义,也略微增加了表的大小;但减少了把它作为外键的表的大小。
(2)外键(Fo reig n Key):外键的作用是建立关系型数据库中表之间的关系(参照完整性),主键只能从独立的实体迁移到非独立的实体,成为后者的一个属性,被称为外键。
(3)索引(Index):利用索引优化系统性能是显而易见的,对所有常用于查询中的Where子句的列和所有用于排序的列创建索引,可以避免整表扫描或访问,在不改变表的物理结构的情况下,直接访问特定的数据列,这样减少数据存取时间;利用索引可以优化或排除耗时的分类*作;把数据分散到不同的页面上,就分散了插入的数据;主键自动建立了唯一索引,因此唯一索引也能确保数据的唯一性(即实体完整性);索引码越小,定位就越直接;新建的索引效能最好,因此定期更新索引非常必要。索引也有代价:有空间开销,建立它也要花费时间,在进行Insert、Delete和Update*作时,也有维护代价。索引有两种:聚族索引和非聚族索引。一个表只能有一个聚族索引,可有多个非聚族索引。使用聚族索引查询数据要比使用非聚族索引快。在建索引前,应利用数据库系统函数估算索引的大小。
① 聚族索引(Clustered Index):聚族索引的数据页按物理有序储存,占用空间小。选择策略是,被用于Where子句的列:包括范围查询、模糊查询或高度重复的列(连续磁盘扫描);被用于连接Join*作的列;被用于Order by和Group by子句的列。聚族索引不利于插入*作,另外没有必要用主键建聚族索引。
② 非聚族索引(Non clustered In dex):与聚族索引相比,占用空间大,而且效率低。选择策略是,被用于Where子句的列:包括范围查询、模糊查询(在没有聚族索引时)、主键或外键列、点(指针类)或小范围(返回的结果域小于整表数据的20%)查询;被用于连接Join*作的列、主键列(范围查询);被用于Order by和Group by子句的列;需要被覆盖的列。对只读表建多个非聚族索引有利。索引也有其弊端,一是创建索引要耗费时间,二是索引要占有大量磁盘空间,三是增加了维护代价(在修改带索引的数据列时索引会减缓修改速度)。那么,在哪种情况下不建索引呢?对于小表(数据小于5页)、小到中表(不直接访问单行数据或结果集不用排序)、单值域(返回值密集)、索引列值太长(大于20bitys)、容易变化的列、高度重复的列、Null值列,对没有被用于Where子语句和Join查询的列都不能建索引。另外,对主要用于数据录入的,尽可能少建索引。当然,也要防止建立无效索引,当Where语句中多于5个条件时,维护索引的开销大于索引的效益,这时,建立临时表存储有关数据更有效。
(4)查询优化规则:在访问数据库表的数据(Access Data)时,要尽可能避免排序(Sort)、连接(Join)和相关子查询*作。经验告诉我们,在优化查询时,必须做到:
① 尽可能少的行;
② 避免排序或为尽可能少的行排序,若要做大量数据排序,最好将相关数据放在临时表中*作;用简单的键(列)排序,如整型或短字符串排序;
③ 避免表内的相关子查询;
④ 避免在Where子句中使用复杂的表达式或非起始的子字符串、用长字符串连接;
⑤ 在Where子句中多使用“与”(And)连接,少使用“或”(Or)连接;
⑥ 利用临时数据库。在查询多表、有多个连接、查询复杂、数据要过滤时,可以建临时表(索引)以减少I/O。但缺点是增加了空间开销。
除非每个列都有索引支持,否则在有连接的查询时分别找出两个动态索引,放在工作表中重新排序。
三、数据库优化代码的方法
数据库在运行中,数据量在几万条纪录以上,为了加快查询速度,我们对数据库进行了优化,优化代码如下:
sp_configure "total memory",32768/*根据内存大小,修改此脚本,此处给Sybase64M内存*/
通过优化,数据库的查询速度大大加快,满足了多台计算机同时工作的要求。
四 小结
任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。要善于使用存储过程,它使SQL变得更加灵活和高效。从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充分利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。
[1] 张厚粲,刘昕著.考试改革与标准参照测验.辽宁教育出版社.1992年9月版
[2] 薛理银 编著.教育信息处理原理.北京师范大学出版社.1996年3月版
[3] 陆建芳,韩莉莉.构建地方文献数据库的思考.图馆馆论坛 .2001(2)
[4] 曾燕 . 信息管理系统的开发与应用.现代图书情报技术.2004(4)
10.3969/j.issn.1001-8972.2010.13.042
本文为黑龙江省教育厅高职高专院校科学技术研究项目《高职院校教学质量评价系统软件的开发与应用》项目编号:11525049
李北芳(1962年6月)、女、大学本科、副教授、电气自动化、数据库方向。