ORACLE中SQL查询优化研究
摘 要 数据库性能问题一直是决策者及技术人员共同关注的焦点,影响数据库性能的一个重要因素就是SQL查询语句的低效率。论文首先分析了导致SQL查询语句性能低下的四个常见原因以及SQL调优的一般步骤,然后分别针对如何降低I/O操作、在查询语句中如何避免对查询结果的高成本操作以及在多表连接时如何提高查询效率进行了分析。
关键词 ORACLE;SQL;优化;连接
1 引言
随着网络应用不断发展,系统性能已越来越引起决策者的重视。影响系统性能的因素很多,低效的SQL语句就是其中一个不可忽视的重要原因。论文首先分析导致SQL性能低下的常见原因,然后分析SQL调优应遵循的一般步骤,最后从如何降低I/O、避免对查询结果的高成本操作和多表连接中如何提高SQL性能进行了研究。鉴于目前ORACLE在数据库市场上的主导地位,论文将只针对ORACLE进行讨论。
2 影响SQL性能的原因
影响SQL性能的因素很多,如初始化参数设置不合理、导入了不准确的系统及模式统计数据从而影响优化程序(CBO)的正确判断等,这些往往和DBA密切相关。纯粹从SQL语句出发,笔者认为影响SQL性能不外乎以下四个重要原因:
(1)在大记录集上进行高成本操作,如使用了引起排序的谓词等。
(2)过多的I/O操作(含物理I/O与逻辑I/O),最典型的就是未建立恰当的索引,导致对查询表进行全表扫描。
(3)处理了太多的无用记录,如在多表连接时过滤条件位置不当导致中间结果集包含了太多的无用记录。
(4)未充分利用数据库提供的功能,如查询的并行化处理等。
第(4)个原因处理起来相对简单。论文将针对前三个原因论述如何提高SQL查询语句的性能。
3 SQL优化的一般步骤
SQL优化一般需经过发现问题、分析问题、提出解决措施、应用措施、测试性能几个步骤,如图1所示。“发现问题就是解决问题的一半”,因此在SQL调优过程中,定位问题SQL是非常重要的一步,一般可借助于ORACLE自带的性能优化工具如STATSPACK、TKPROF、AUTOTRACE等辅助用户进行,同时还应该重视动态性能视图如V$SQL、V$MYSTAT、V$SYSSTAT等的研究。
图1 SQL优化的一般步骤
4 SQL语句的优化
4.1 优化排序操作
排序的成本十分高昂,当在查询语句中使用了引起结果集排序的谓词时,SQL性能必然受到影响。
4.1.1 排序过程分析
当待排序数据集不是太大时,服务器在内存(排序区)完成排序操作,如果排序需要更多的内存空间,服务器将进行如下处理:
(1) 将数据分成多个小的集合,对每一集合进行排序。
(2) 服务器向磁盘申请临时空间,将排好序的中间结果写入临时段,再对另外的集合进行排序。
(3) 在所有的集合均排好序后,服务器再将它们进行合并得到最终的结果,如果排序区尺寸太小,合并无法一次完成时,将分多次进行。
从上述分析可知,排序是一种十分昂贵的操作,它消耗大量的CPU时间和内存,触发磁盘分页和交换操作,因此只要有可能,我们就应该在SQL语句中尽量避免排序操作。
4.1.2 SQL中引起排序的操作
SQL查询语句中引起排序的操作大致有:ORDER BY 和GROUP BY 从句;DISTINCT修饰符;UNION、INTERSECT、MINUS集合操作符;多表连接时的排序合并连接(SORT MERGE JOIN)等。
4.1.3 如何避免排序
1)建立恰当的索引
对经常进行排序和连接操作的字段建立索引。在建立索引后,当服务器向这些字段发出排序请求时,将直接引用索引而不进行排序操作;当进行等值连接查询操作时,若建立连接的字段未建立索引,服务器进行的是排序合并连接(SORT MERGE JOIN),连接操作的过程如下:
对进行连接的两个或多个表分别进行全扫描;
对每一个表中的行集分别进行全排序;
合并排序结果。
如果建立连接的字段已建立索引,服务器进行嵌套循环连接(NESTED LOOP JOINS),该连接方式不需要任何排序,其过程如下:
对驱动表进行全表扫描;
对返回的每一行利用连接字段值实施索引惟一扫描;
利用从索引扫描中返回的ROWID值在从表中定位记录;
合并主、从表中的匹配记录。
因此,建立索引可避免多数排序操作。
2)用UNIION ALL替换UNION
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。大部分应用中是不会产生重复记录的,最常见的是过程表与历史表UNION 。因此,采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。
4.2 优化I/O
过多的I/O操作会占用CPU时间、消耗大量内存和占用过多的栓锁,因此有必要对SQL的I/O进行优化。优化I/O的最有效方式就是用索引扫描代替全表扫描。
4.2.1 应用基于函数的索引
基于函数的索引(FUNCTION BASED INDEX,简记为FBI)提供了索引计算列并在查询中使用这些索引的能力。FBI的实质是对查询所需中间结果进行预处理。如果一个FBI与查询语句中的内嵌函数完全匹配,CBO在生成查询计划时,将自动启用索引范围扫描(INDEX RANGE SCAN)替换全表扫描(FULL TABLE SCAN)。考察下面的代码段并用AUTOTRACE观察创建FBI前后执行计划的变化。
select * from emp where upper(ename)=’SCOTT’
创建FBI前,很明显是全表扫描。
Execution Plan
……
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (Cost=2 Card=1 Bytes=22)
idle>CREATE INDEX EMP_UPPER_FIRST_NAME ON EMPLOYEES(UPPER(FIRST_NAME));
索引已创建。
再次运行相同查询,
Execution Plan
……
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (Cost=1 Card=1 Bytes=22)
2 1 INDEX (RANGE SCAN) OF 'EMP_UPPER_FIRST_NAME' (NON-UNIQUE) (Cost=1 Card=1)
这一简单的例子充分说明了FBI在SQL查询优化中的作用。FBI所用的函数可以是用户自己创建的函数,该函数越复杂,基于该函数创建FBI对SQL查询性能的优化作用越明显。
4.2.2 应用物化视图和查询重写
物化视图是一个预计算结果集,其中通常包含聚集与多表连接等复杂操作。数据库自动维护物化视图,且随用户的要求进行刷新。查询重写机制就是用数据库中的替代对象(如物化视图)将用户提交的查询重写为完全不同但功能等价的查询。查询重写对用户透明,用户完全按常规编写访问数据库的查询语句,优化程序(CBO)自动决定是否对用户提交的查询进行重写。查询重写是提高查询性能的一种非常有效的方法,尤其是在数据仓库环境中针对汇总、多表连接以及其它高成本的操作方面。
下面以一个非常简单的例子来演示物化视图和查询重写在优化SQL查询性能方面的作用。
select dept.deptno,dept.dname,count(*)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dept.dname
查询计划及主要统计数据如下:
执行计划:
-----------------------------------------
……
2 1 HASH JOIN (Cost=5 Card=14 Bytes=224)
3 2 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=52)
4 2 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=42)
主要统计数据:
-----------------------------------------
305 recursive calls
46 consistent gets
创建物化视图EMP_DEPT:
create materialized view emp_dept build immediate
refresh on demand
enable query rewrite
as
select dept.deptno,dept.dname,count(*)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dept.dname
/
再次执行查询,执行计划及主要统计数据如下:
执行计划:
-------------------------------------
……
1 0 TABLE ACCESS (FULL) OF 'EMP_DEPT' (Cost=2 Card=327 Bytes=11445)
主要统计数据:
------------------------------------
79 recursive calls
28 consistent gets
可见,在建立物化视图之前,首先执行两个表的全表扫描,然后进行HASH连接,再进行分组排序和选择操作;而建立物化视图后,CBO自动将上述复杂操作转换为对物化视图EMP_DEPT的全扫描,相关的统计数据也有了很大的改善,递归调用(RECURSIVE CALLS)由305降到79,逻辑I/O(CONSISTENT GETS)由46降为28。
4.2.3 将频繁访问的小表读入CACHE
逻辑I/O总是快于物理I/O。如果数据库中存在被应用程序频繁访问的小表,可将这些表强行读入KEEP池,从而避免物理I/O的发生。
4.3 多表连接优化
最能体现查询复杂性的就是多表连接,多表连接操作往往要耗费大量的CPU时间和内存,因此多表连接查询性能优化往往是SQL优化的重点与难点。
4.3.1 消除外部连接
通过消除外部连接,不仅使得到的查询更易于读取,而且性能也经常可以得到改善。一般的思路是,有以下形式的查询:
SELECT …,OUTER_JOINED_TABLE.COLUMN
FROM SOME_TABLE,OUTER_JOINED_TO_TABLE
WHERE …=OUTER_JOINED_TO_TABLE(+)
可转换为如下形式的查询:
SELECT …,(SELECT COLUMN FROM OUTER_ JOINED_TO_TABLE WHERE …)FROM SOME_TABLE;
4.3.2 谓词前推,优化中间结果
多表连接的性能低下多数是因为连接操作与过滤操作的次序不合理,大多数用户在编写多表连接查询时,总是先进行连接操作再应用过滤条件,这导致服务器做了太多的无用功。针对这类问题,其优化思路就是尽可能将过滤谓词前推,使不符合条件的记录提前被筛选掉,只对符合条件的少数记录进行连接处理,这样可成倍的提高SQL查询效能。
标准连接查询如下:
Select a.prod_name,sum(b.sale_quant),
sum(c.sale_quant),sum(d.sale_quant)
From product a,tele_sale b,online_sale c,store_sale d
Where a.prod_id=b.prod_id and a.prod_id=c.prod_id
and a.prod_id=d.prod_id And a.order_date>sysdate-90
Group by a.prod_id;
启用内嵌视图,且将条件a.order_date>sysdate-90前移,优化后代码如下:
Select a.prod_name,b.tele_sale_sum,c.online_sale_sum,d.store_sale_sum From product a,
(select sum(sal_quant) tele_sale_sum from product,tele_sale
Where product.order_date>sysdate-90 and product.prod_id =tele_sale.prod_id) b,
(select sum(sal_quant) online_sale_sum
from product,tele_sale
Where product.order_date>sysdate-90 and product.prod_id =online_sale.prod_id) c,
(select sum(sal_quant) store_sale_sum
from product,store_sale
Where product.order_date>sysdate-90 and product.prod_id =store_sale.prod_id) d,
Where a.prod_id=b.prod_id and
a.prod_id=c.prod_id and a.prod_id=d.prod_id;
5 结束语
SQL语言在数据库应用中占有非常重要的地位,其性能的优劣直接影响着整个信息系统的可用性。论文从影响SQL性能的最主要的三个方面入手,分析了如何优化SQL查询的I/O、避免高成本的排序操作和优化多表连接。需要强调的一点是,理解SQL语句所解决的问题比SQL调优本身更重要,因此SQL调优需要系统分析人员、开发人员和数据库管理员密切协作。
参考文献
[1]Thomas Kyte.Effective Oracle by Design:Design and Build High-performance Oracle Application[M],The McGral- Hill Companies,Inc,2003
[2]Kevin Loney,George Koch,Oracle 9i:The Complete Reference[M],The McGral-Hill Companies,Inc,2002
[3] Oracle9i SQL Reference release 2(9.2)[OL/M],2002.10. http://
[4] Oracle9i Data Warehousing Guide release 2(9.2) [OL/M],2002.03. http://
[5]Alexey Danchenkov,Donald Burleson,Oracle Tuning:The Definitive Reference[OL/M],Rampant Techpress,2006.
[6] Oracle9i Database Concepts release 2(9.2) [OL/M],2002.08. http://
[7] Oracle9i supplied plsql packages and types reference release 2(9.2) [OL/M],2002.12. http:// technology/
数据库完整性(Database Integrity)是指数据库中数据的正确性和相容性。数据库完整性由各种各样的完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。数据库完整性约束可以通过DBMS或应用程序来实现,基于DBMS的完整性约束作为模式的一部分存入数据库中。通过DBMS实现的数据库完整性按照数据库设计步骤进行设计,而由应用软件实现的数据库完整性则纳入应用软件设计(本文主要讨论前者)。数据库完整性对于数据库应用系统非常关键,其作用主要体现在以下几个方面:
1.数据库完整性约束能够防止合法用户使用数据库时向数据库中添加不合语义的数据。
2.利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率。同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。
3.合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能。比如装载大量数据时,只要在装载之前临时使基于DBMS的数据库完整性约束失效,此后再使其生效,就能保证既不影响数据装载的效率又能保证数据库的完整性。
4.在应用软件的功能测试中,完善的数据库完整性有助于尽早发现应用软件的错误。
数据库完整性约束可分为6类:列级静态约束、元组级静态约束、关系级静态约束、列级动态约束、元组级动态约束、关系级动态约束。动态约束通常由应用软件来实现。不同DBMS支持的数据库完整性基本相同,Oracle支持的基于DBMS的完整性约束如下表所示:
数据库完整性设计示例
一个好的数据库完整性设计首先需要在需求分析阶段确定要通过数据库完整性约束实现的业务规则,然后在充分了解特定DBMS提供的完整性控制机制的基础上,依据整个系统的体系结构和性能要求,遵照数据库设计方法和应用软件设计方法,合理选择每个业务规则的实现方式;最后,认真测试,排除隐含的约束冲突和性能问题。基于DBMS的数据库完整性设计大体分为以下几个阶段:
1.需求分析阶段
经过系统分析员、数据库分析员、用户的共同努力,确定系统模型中应该包含的对象,如人事及工资管理系统中的部门、员工、经理等,以及各种业务规则。
在完成寻找业务规则的工作之后,确定要作为数据库完整性的业务规则,并对业务规则进行分类。其中作为数据库模式一部分的完整性设计按下面的过程进行。而由应用软件来实现的数据库完整性设计将按照软件工程的方法进行。
2.概念结构设计阶段
概念结构设计阶段是将依据需求分析的结果转换成一个独立于具体DBMS的概念模型,即实体关系图(ERD)。在概念结构设计阶段就要开始数据库完整性设计的实质阶段,因为此阶段的实体关系将在逻辑结构设计阶段转化为实体完整性约束和参照完整性约束,到逻辑结构设计阶段将完成设计的主要工作。
3.逻辑结构设计阶段
此阶段就是将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化,包括对关系模型的规范化。此时,依据DBMS提供的完整性约束机制,对尚未加入逻辑结构中的完整性约束列表,逐条选择合适的方式加以实现。
在逻辑结构设计阶段结束时,作为数据库模式一部分的完整性设计也就基本完成了。每种业务规则都可能有好几种实现方式,应该选择对数据库性能影响最小的一种,有时需通过实际测试来决定。
数据库完整性设计原则
在实施数据库完整性设计的时候,有一些基本的原则需要把握:
1.根据数据库完整性约束的类型确定其实现的系统层次和方式,并提前考虑对系统性能的影响。一般情况下,静态约束应尽量包含在数据库模式中,而动态约束由应用程序实现。
2.实体完整性约束、参照完整性约束是关系数据库最重要的完整性约束,在不影响系统关键性能的前提下需尽量应用。用一定的时间和空间来换取系统的易用性是值得的。
3.要慎用目前主流DBMS都支持的触发器功能,一方面由于触发器的性能开销较大,另一方面,触发器的多级触发不好控制,容易发生错误,非用不可时,最好使用Before型语句级触发器。
4.在需求分析阶段就必须制定完整性约束的命名规范,尽量使用有意义的英文单词、缩写词、表名、列名及下划线等组合,使其易于识别和记忆,如:CKC_EMP_REAL_INCOME_EMPLOYEE、PK_EMPLOYEE、CKT_EMPLOYEE。如果使用CASE工具,一般有缺省的规则,可在此基础上修改使用。
5.要根据业务规则对数据库完整性进行细致的测试,以尽早排除隐含的完整性约束间的冲突和对性能的影响。
6.要有专职的数据库设计小组,自始至终负责数据库的分析、设计、测试、实施及早期维护。数据库设计人员不仅负责基于DBMS的数据库完整性约束的设计实现,还要负责对应用软件实现的数据库完整性约束进行审核。
7.应采用合适的CASE工具来降低数据库设计各阶段的工作量。好的CASE工具能够支持整个数据库的生命周期,这将使数据库设计人员的工作效率得到很大提高,同时也容易与用户沟通。
你可以围绕相关内容发表自己的看法
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。
Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。
比较好的论文题目:基于SQL Server的数据库管理系统设计
库存管理数据库系统原理与应用
【摘 要】库存管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强.数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。
经过分析如此情况,我们使用微软公司的VisualBasic开发工具,利用其提供的各种面向对象的开发工具,尤其是ADO,是能方便而简洁操纵数据库的智能化对象,短期内就可以开发出用户满意的可行系统。
关键字: 库存管理 ADO 面相对象 库存ABC分析
第一章 概述
1.1 库存管理的必要性
大多数库存管理理论认为,库存是物理上和逻辑上库房库位的所有有形和无形物料极其价值的总和,具体包括成品、原材料、在制品、在途品、生产前物料、备品备件等。虽然持有一些库存是必要的,过量的库存却非但没有用处而且占用了资金。占用的资金对于公司发展、新产品开发等都是非常需要的;减少资金占用还可以大大减少来自银行贷款的利息和风险。对那些采购量特别大、采购件市场价格有波动的物料库存,加强库存管理效果更为明显。因此,平衡公司库存投资与其它资金需求至关重要。
1.2 库存分类
企业怎样管理库存,是库存管理的最大难点和挑战。因此,通过MRPII物料主计划模块和采购模块建立计划与控制系统以有效地实施库存管理和采购补偿成为题中应有之义。通过调查,我们得知任何库存均可分为如下三类:
A类物品:高值──价值占库存总值70-80%的相对少数物品。通常为物品的15-20%。
B类物品:中值──总值占库存总值的15-20%。物品数居中,通常占物品的30-40%。
C类物品:低值──库存总值几乎可以忽略不计,只占5-10%。是物品的大多数,通常占60-70%。
显然,A类物品是关键;如果我们把精力集中于A类物品,使其库存压缩10-50%,就是总库存的相当可观的一笔压缩。
关于ABC分类方法有几条基本法则:
a. 控制的程度:
对A类物品严加控制,包括做完备、准确的记录,高层监督和经常评审,从供应商按大合同订单频繁交货,对车间紧密跟踪以压缩提前期。
对B类物品做正常控制,包括良好的记录与常规的关注。
对C类物品尽可能使用简便的控制,诸如定期目视检查库存实物、简要记录或以简便标志法表明补充存货已经订货,采用大库存量与订货量以避免缺货,安排车间日程计划时给以低优先级。
b.优先级
在一切活动中给A类物品以高优先级以压缩其提前期与库存。
对B类物品予以正常处理,仅在关键时给以高优先级。
予C类物品以最低优先级。
c.订货过程
对A类物品提供及时、准确的采购信息和状态查询。计算机数据需要人工加以核对,进行阶段性盘点,以及频繁的评审以压缩库存。
对B类物品,按一定周期或当发生重大变化时评审一次库存数据和订货点,MRPII操作按例行公事处理。
对C类物品可以盘点处理或订货点计算。订货往往不用MRPII作计划。可以凭业务人员的经验加以控制。
由上可以看出库存管理的重要性。因此,库存管理是企业管理的重要组成部分。市场需要库存商品提供给用户,企业的经营需要库存保证各种药品的供应以进行药品的销售,库存对生产效率的提高有着极其重要的影响。因此,库存管理系统是计算机管理系统的中心。因为,所有企业的经营活动都离不开物流的活动。
1.3 库存管理的目标
库存管理的主要目标就是通过对仓库所有入出库活动的管理和控制及对库存数据有效的统计和分析,以保证企业生产中畅通的物流,使决策人员及早发现问题,采取相应措施,调整库存结构,缩短储备周期,加速资金周转,最大限度地降低库存占用,同时,通过周期性的仓库盘点,及时补救管理中的漏洞,使库存管理系统实时地反映企业中各个仓库的现时情况,为各类管理人员从不同侧面提供所需信息,以便协调企业经营收到更大效益,库存管理系统是协调企业生产经营的基础,其数据的准确性、方便的查询、有效的分析是整个计算机管理系统顺利运行的关键。
第二章 开发背景
企业的库存物资管理往往是很复杂、很繁琐的。由于所掌握的物资种类众多,订货、管理、发放的渠道各有差异,各个企业之间的管理体制不尽相同,各类统计报表繁多,因此仓库的库存管理必须编制一套库存管理信息系统,实现计算机化操作,而且必须根据企业的具体情况制定相应的方案。
根据当前的企业管理体制,一般的库存管理系统,总是根据所掌握的物资类别,相应分成几个科室来进行物资的计划,订货,核销托收,验收入库,根据企业各个部门的需求来发送物资设备,并随时按期进行库存盘点,作台帐,根据企业领导和自身管理的需要按月、季度、年度进行统计分析,产生相应报表。为了加强关键物资、设备的管理,要定期掌握其储备,消耗情况,根据计划定额和实际纤毫定额的比较,进行定额管理,使得资金使用合理,物资设备的储备最佳。
一个完整的企业物资供应管理系统应包括采购计划管理,合同收托管理、仓库库存管理、定额管理、统计管理、财务管理等模块。其中仓库的库存管理是整个物资供应管理系统的核心。因此有必要开发一套独立的库存管理系统来提高企业工作效率, 而所使用的这套库存管理系统是企业生产经营管理活动中的核心,此系统必须可以用来控制合理的库存费用、适时适量的库存数量,使企业生产活动效率最大化。通过对这些情况的仔细调查,我开发了下面的仓库库存管理系统。
第三章 系统分析
本系统采用了结构化生命周期法,结构化生命周期法是最常用的管理信息系统开发方法,分为四个步骤,即系统调研分析、数据库设计实现、界面设计实现和系统功能设计实现。其中系统调研分析阶段是最基础、也是最容易被开发人员忽视的环节。
3.1进行资料收集
在整个系统分析阶段,我在图书馆认真查看了很多关于仓库库存管理方面的书籍,收集到了相应的入库单、领料单、台账、物料卡、报表等资料。
入库单是入库单位在把相应的零部件送人仓库时必须填写的单据;领料单是领料人员从仓库中领取零部件时必须填写的单据(即出库);零部件台账(相当于本系统中的操作日志)实际是一个流水账,用于记录每天发生的入库、出库信息;物料卡(在本系统中用现有库存信息来表示)的作用是记录某一种零部件的数量变化,以便库管员盘查;报表是仓库向有关领导和部门定期提交的零部件库存汇总信息。收集到的入库单、领料单、零部件库存台账、零部件物料卡等单据和报表的实物样式在此略去,有兴趣者请参考有关类似企业的样本即可。
3.2绘制业务流程图
3.3用户需求分析
用户需求分析就是在用户需求调研的基础上,确定系统的总体结构方案,完成相应的需求分析报告。在确定系统的总体结构方案过程中,包括确定应用程序的结构、系统开发环境和系统的功能模块。用户需求调研结束之后,应该立即进行用户需求分析。
3.3.1应用程序结构确定
从用户应用角度来看,可把应用程序系统的组成部分分成数据存储层、业务处理层和界面表示层等3个层次,而应用程序结构可归纳为:集中式应用程序结构、单用户应用程序结构、多层服务器应用程序结构、浏览器/服务器应用程序结构、客户机/服务器应用程序结构等5种类型。
本库存管理系统就采用了当前最流行的客户机/服务器应用程序结构(即C/S结构),此时,客户机提出请求,服务器对客户机的请求作出回应。通过对服务功能的分布实现了分工服务。数据存储层放在服务器上,业务处理层和界面表示层放在客户机上,因此又被称为“灵敏的客户机”结构。许多操作可以在本地的客户机上执行,只是当需要数据时,才向服务器发出请求。并使应用程序的处理更接近用户,使整个系统具有较好的性能,可以并行地处理应用程序的请求、减少了数据传输量、降低了服务器的负荷。由于条件所限,将此系统所有程序都置于一台计算机上,以便调试运行。
3.3.2确定系统开发环境
由于大多数公司内部使用的计算机平台都是基于Windows环境的。为了降低系统成本,应最大程度地利用现有的资源、兼容现有的环境,可确定使用下面的开发环境:
★网络操作系统:Windows2000;★数据库服务器:MicrosoftAccessr2000;
★服务器平台:Windows2000;★客户机平台:Windows95/98/NT/2000;
★前端开发工具:visualBasic6.0(企业版);★数据访问对象:ADO(本系统使用ADO控件,简化编程)。
3.3.3确定系统的功能模块
通过分析确定库存系统将包含6个主要功能模块,即系统模块、入库业务管理模块、出库业务管理模块、退料业务管理模块(还库业务管理模块)、盘点业务管理模块(报表输出)、需求管理模块。对于每一个功能模块,都包含了数据录入、编辑、查询、统计、打印、应急、帮助等功能。
第四章 系统设计
4. 1总体设计
4.1.1系统目标设计
系统开发的总体任务是实现企业物资设备管理的系统化、规范化和自动化,从而达到企业仓库库存管理效率的目的。
4.1.2开发设计思想
库存管理的物资主要是企业生产中所需要的各种设备、原材料及零部件。进货时经检查合同确认为有效托收后,进行验收入库,填写入库单,进行入库登记。企业各个部门根据所需要的物资设备总额和部门生产活动需要提出物资需求申请。计划员根据整个企业的需求开出物资设备出库单,仓库管理员根据出库单核对发放设备、原材料及零部件。有些设备使用完毕需要及时归还入库,填写还库单。根据需要按照月、季、年进行统计分析,产生相应报表。
仓库库存管理的特点是信息处理量比较大。所管理的物资设备、原材料及零部件种类繁多,而且由于入库单、出库单、需求单等单据发生量特别大,关联信息多,查询和统计的方式各不相同,因此在管理上实现起来有一定的困难。在管理的过程中经常会出现信息的重复传递;单据、报表种类繁多,各个部门规格不统等问题。
在本系统的设计过程中,为了克服这些困难,满足计算机管理的需要,我们采取了下面的一些原则:
统一各种原始单据的格式,统一帐目和报表的格式。
删除不必要的管理冗余,实现管理规范化、科学化。
程序代码标准化,软件统一化,确保软件的可维护性和实用性。
界面尽量简单化,做到实用、方便,尽量满足企业中不同层次员工的需要。
建立操作日志,系统自动记录所进行的各种操作。
4.1.3系统功能分析
本系统需要完成的功能主要有以下几点。
库存管理的各种信息的输入,包括入库、出库、还库、需求信息的输入等。
库存管理的各种信息的查询、修改和维护。
设备采购报表的生成。
在材料库存中加入所允许的最大库存合最小库存字段,对所有库存物资实现监控和报警。
企业各个部门的物资需求管理。
操作日志的管理
库存管理系统的使用帮助。
4.2详细设计
4.2.1 系统功能模块设计
系统模块
a. 包括报表的打印及设置,操作日志的管理。
b. 管理员可以通过管理界面添加或删除用户,添加新管理员或删除原有管理员,验证用户的合法性,阻止非法用户登录。
c. 管理员或其他用户可以修改自己的密码。
(2) 入库模块
包括填写入库单,更新,删除入库记录,查看现有库存信息,入库记录的查询及打印
(3) 出库模块
包括填写出库单,更新,删除出库记录,查看现有库存信息,出库记录的查询及打印
(4) 还库模块
包括填写还库单,更新,删除还库记录,还库记录的查询及打印
(5) 需求模块
包括填写需求计划表,更新,删除采购计划信息,查看现有采购信息,采购信息的查询及打印,以及预测短期内的需求计划。
4.2.2数据库设计
数据库需求分析
通过对企业仓库管理内容和数据流程分析,设计的数据项合数据结构如下:
设备代码信息。包括的数据项有设备号、设备名称。
现有库存信息。包括的数据项有现有设备、现有数目、最大库存、最小库存等。
设备使用信息。包括的数据项有使用的设备、使用部门。数目。使用时间、出库时状态等。
设备采购信息。包括的数据项有采购的设备、采购员、供应商、采购数目、采购时间等。
设备归还信息。包括的数据项有归还设备、归还部门、归还数目、归还时间、经手人等。
设备需求信息。包括的数据项有需求的部门、需求设备、需求数目、需求时间等。
有了上面的数据结构、数据项和数据流程,就可以进行下面的数据库设计。
数据库概念结构设计
这一设计阶段是在需求分析的基础上,设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。根据上面的设计规划出的实体有库存实体、出库实体、入库实体、采购实体、还库实体、需求实体。 数据库逻辑结构设计
在上面的实体以及实体之间关系的基础上,形成各个表格之间的关系。
4.3 代码设计
任何库存均可分为如下三类:
A类物品:高值──价值占库存总值70-80%的相对少数物品。通常为物品的15-20%。
B类物品:中值──总值占库存总值的15-20%。物品数居中,通常占物品的30-40%。
C类物品:低值──库存总值几乎可以忽略不计,只占5-10%。是物品的大多数,通常占60-70%。
4.4 输入输出设计
本系统界面标准Windows形式,键盘输入(也可以用条形码读取),人机交互,容易使用。输入输出的设计考虑美观实用和通俗易懂,图文并茂。
4.5系统安全性设计
系统数据库中包含多个二维表,所以在系统与数据库的连接上,并没有把数据库和系统的连接直接写入代码,而是通过对服务器端进行系统设置,使数据库名及路径不可见,并通过ACCESS的数据库安全设置,保证了数据库的安全性。系统根据用户身份不同赋予不同权限,用户用密码登陆,同样也保证了系统数据的安全性。
第五章 系统实施
5.1、开发工具简介
本系统的前端开发工具,我选择了Visual Basic6.0,后台数据库采用Access2000。
5.1.1 VB简介
Visual意为“可视化的”,指的是一种开发图形用户界面的方法,所以Visual Basic是基于Basic的可视化的程序设计语言。在Visual Basic中,一方面继承了Basic所具有的程序设计语言简单易用的特点,另一方面在其编程系统中采用了面向对象、事件驱动的编程机制,用一种巧妙的方法把Windows的编程复杂性封装起来,提供了一种所见即所得的可视化程序设计方法。
5.1.2 VB功能特点
具有面向对象的可视化设计工具
在VB中,应用面向对象的程序设计方法(OOP),把程序和数据封装起来视为一 个对象,每个对象都是可视的。程序员在设计时只需用现有工具根据界面设计要求,直接在屏幕上“画”出窗口、菜单、按钮、滚动条等不同类型的对象,并为每个对象设置属性。程序员的编程工作仅限于编写相关对象要完成的功能程序,因而程序设计的效率可大大提高。
事件驱动的编程机制
事件驱动是非常适合图形用户界面的编程方式。在图形用户界面的应用程序中,是由用户的动作即事件掌握着程序运行的流向,每个事件都能驱动一段程序的运行。程序员只要编写响应用户动作的代码,而各个动作之间不一定有联系。
提供了易学易用的应用程序集成开发环境
在VB集成开发环境中,用户可设计界面、编写代码、调试程序,直至把应用程序编译成可执行文件在Windows中运行,使用户在友好的开发环境中工作。
结构化的程序设计语言
VB具有丰富的数据类型和结构化程序结构,作为一种程序设计语言,它还有如下一些特点:
强大的数值和字符串处理功能
丰富的图形指令,可方便地绘制各种图形
提供静态和动态数组,有利于简化内存的管理
过程可递归调用,使程序更为简练
支持随机文件和顺序文件的访问
提供了一个可供应用程序调用的包含多种类型的图标库
具有完善的运行出错处理
支持多种数据库系统的访问
利用数据控件可访问的数据库系统有:Microsoft Access、Btrieve、DBASE、Microsfot FoxPro和Paradox等,也可以访问Microsoft Excel、Lotus1-2-3等多种电子表格。
支持动态数据交换(DDE)、动态链接库(DLL)和对象的链接与嵌入(OLE)技术
完备的HELP联机帮助功能
与Windows环境下的软件一样,在VB中,利用帮助菜单和F1功能键,用户可以随时方便地得到所需要的帮助信息。VB帮助窗口中显示了有关的示例代码,通过复制、粘贴操作可获取大量的示例代码,为用户的学习和使用提供了极大的方便。
VB程序设计的概念就是面向对象的概念,对象就是数据(DATA)和代码(CODE)互相结合的综合体。Windows上面的每一个图标,包括窗口本身都是对象,如果没有任何事情发生,对象处于停顿状态。当存在外来事件时,程序段执行,它的执 行是由外来事件决定的。因此是“事件”驱动的。
编写VB程序较为简单,首先将各个对象放在空白窗体上,然后将程序代码分别添加给对象或图标,将它们组合起来就可以随意运行了。
在VB中,窗体实际上是一个对象,VB的窗体含有许多内嵌特性,这使得用户界面部分的建立像是从一个目录中挑选一个个合适的控件,而不是从零开始一步一步地建立控件。这种开发者能亲眼看到的程序设计过程就是“可视化程序设计”(Visual Programming)
5.1.3 VB中的基本概念
对象:面向对象编程(OOP)的提法大家一定也很耳熟,虽然Visual Basic并不是完全的面向对象编程,但也利用了对象编程技术。对象简单地说就是大家经常看到的各种窗口、按钮、文本框甚至打印机等。
属性:如同电视有黑白、彩色之分一样,作为对象的Windows中的窗口也是有大有小,文本框的位置不可能完全一样,菜单要显示出不同的功能,这些都是由对象的属性决定的。不同对象的属性可能不同。属性一般决定了对象的位置、大小、显示等情况。
方法:就是对象能够做的事,如打印机对象就有打印(Print)方法、窗口对象支持隐藏(Hide)方法、很多对象支持移动(Move)方法等。
事件:就是对象对用户各种操作的反映情况。如用户用鼠标按一下按钮,就会触发按钮的“按”(Click)事件。
控件:控件就是Visual Basic提供的编程用的模块,与对象有直接的联系,如同积木的木块,使用这样的控件,就可以像拼图或堆积木一样“搭”、“拼”你的程序界面。Visual Basic中使用控件,简化了Windows中的窗口、按钮等对象的编程设计。每个控件都有各自的属性、事件及方法。只需修改这些特征你就可以随心所欲地编程了。最重要的是,你可以利用成千上万的各种扩充的控件来快速构造几乎能满足你任何要求的程序。例如,如果你不满意Windows简陋的媒体播放器,你就可以使用VB的多媒体控件在1小时以内设计一个完全自己风格的能够播放CD、VCD的多媒体播放器,而功能完全与之相当。
5.1.4 Access2000数据库简介
作为Microsoft的office套件产品之一,access已经成为世界上最流行的桌面数据库系统。Access与许多优秀的关系数据库一样,可以让你很容易地连接相关的信息而且还对其他的数据库系统有所补充。它能操作其它来源的资料,包括许多流行的PC数据库程序(如dBASE,Paradox,Microsoft FoxPro)和服务器、小型机及大型机上的许多SQL数据库。Access还完全支持Microsoft的OLE技术。
Access还提供windows操作系统的高级应用程序开发系统。Access与其它数据库开发系统之间相当显著的区别就是:您不用写一行代码,就可以在很短的时间里开发出一个功能强大而且相当专业的数据库应用程序,并且这一愉快的过程是完全可视的!如果您能给它加上简短的VBA代码,那么您的程序决不比专业程序员潜心开发的程序差。
Access的总体结构
Access将所有有名字的东西都成为对象(object),在Access 2000中,最重要的对象有表,查询,窗体,报表,宏和模块。
表 用户定义的存储资料的对象。每一个表都包含有关某个主体的信息。表包括存储不同种类资料的字段(列),而记录(行)则收集特定主体实例的所有信息。
查询 为来自一个或多个表的资料提供定制视图的对象。在Access中,可以利用图形化的实例查询机制(QBE)或通过SQL语句来建立查询。你可以在查询中选择、更新、插入或删除资料,也可以用查询来建立新表。
窗体 窗体是主要的人机接口。大量的操作(几乎所有)都要通过窗体完成。窗体通过运行宏(macro)或Visual Basic for Applicatinns(VBA)过程,来响应大量的事件。Access 2000为我们提供了强大的(同时也是相当方便的向导)来建立标准的Windows窗体。
报表 为格式化、计算、打印选定资料而设计的对象。它是衡量一个优秀的数据库的重要标准(有时甚至是唯一的标准)。
宏 为了响应已定义的事件,需要让Access去执行一个或多个操作,而宏就是对这些操作的结构化的定义对象。它可以让你像堆积木一样建立一个功能强大的程序,而无须写大量的代码。
模块 包括用VBA编码的定制过程的一个对象。模块提供了独立的动作流以捕获错误,而宏做不到。模块能直接响应窗体或报表事件,也可以从应用程序的任何地方被调用。
5.2 系统实现
5.2.1.系统管理模块实现
5..2.3入库模块的实现
5..2.4 出库模块实现
5.2.5设备采购模块实现,程序略
5.2.7设备代码模块实现
5.2.9 操作日志模块实现
第六章 系统使用说明
参考文献:
1. 数据库系统原理教程 王珊 陈红 清华大学出版社
2. 管理信息系统 王虎 张俊 武汉理工大学出版社
3. Visual Basic 数据库开发 E.Winemiller,J.Roff B.Heyman,R.Groom 著 清华大学出版社
4. PowerBuilder 8.0数据库系统开发实例导航 何旭洪 余建英 人民邮电出版社
5. VB6从入门道精通 『美』Gary cornell 著 北京希望电子出版社
6. managing Information Systems David L.Anderson著 清华大学出版社
7. Management Information Systems Raymond Mcleod,Jc George Schell 著 北京大学出版社
你的数据库设计思想是什么,他是具体怎么实现的.你的表与表之间是如何联系的,你的字段类型是什么,为什么这样设置,有什么好处.如何优化你的数据库