数据库
销售单据表(销售单据编号,销售时间,销售人员编号,收银台编号)
销售单据明细表(销售单据编号,商品编号,单价,数量)
在进行此报表计算时数据库服务器CPU消耗非常高。为了优化此操作,某工程师建议在销售单据表中增加“付款总金额”属性,取值由触发器自动计算。请从磁盘空间使用、销售操作时对数据库服务器的影响、数据一致性以及对总销售额计算速度影响方面分析此方案优劣。请判断此方案是否可行,并从时空代价和优化效果方面分析原因。
在数据库设计阶段,主要强调的是高效率利用存储空间,减少数据的冗余,减少数据的不一致性,这个过程也就是规范化的过程。但是在数据库运行阶段要考虑到高效率的进行数据处理。
完全规范化的数据库会产生很多表,对于一个频繁使用的查询,如果它要求操作多个相关表中的数据,则每次为生成需要的查询结果而在连接的多个表中相关连时,数据库管理系统就会消耗更多的计算资源,因为连接操作非常耗时。
而反规范化是将规范化的关系转换为非规范化的关系的过程,目的是提高查询的效率。
常见的方法有增加派生冗余列,增加冗余列,重新组表,分割表和新增汇总表等方法。
该题解决的方式就是增加派生冗余列——“付款总金额”。派生性冗余列是指表中增加的列由表中的一些数据项经过计算而成,它的作用是查询时减少连接操作,避免使用聚合函数。例如销售单据明细表(销售单据编号,商品编号,单价,数量)中增加“付款总金额”,因为付款总金额=单价*数量得到,说明“付款总金额”是派生性冗余列。如果不要该字段,那么每次使用总价时,都要先执行代码计算后才能使用,如果商品数量较多,而且要频繁使用“付款总金额”时,计算“付款总金额”时执行的次数也会随着增加,这显然会影响数据库的执行效率。若增加“付款总金额”这个派生性冗余字段,虽然破坏了规范化原则,但只要执行一次计算“付款总金额”就可以把商品金额存在数据库中,以后不管什么时候使用“付款总金额”字段,只需要提取其值就可以了,不必在执行代码了。因此增加“付款总金额”,虽然增加了磁盘空间的使用率,但是可以提高系统执行的效率,达到以空间换时间的目的。
【参考答案】
此方案不可行。该方案不可行的原因有如下两点。
①触发器可以通过数据库中的相关表进行层叠更改,这比直接把代码写在前台的做法更安全合理,保证了数据的一致性,但同时增加了磁盘空间的消耗。在超市经营中要批量操作、多次触发的情况下,触发器的效率低,因为它相当于每次都执行一段SQL语句,使CPU的消耗更高。因而从时空代价角度来说并不能达到优化的效果。
②在数据单据表中增加“付款总金额”属性并不是最优的解决方法,应该在数据单据明细表中增加“付款总金额”属性,这样才能提高查询效率。
你可能感兴趣的试题
A.数据库物理结构设计
B.数据库事务详细设计
C.应用程序详细设计
D.数据库备份与恢复设计
A.4个
B.5个
C.6个
D.7个
A.数据流
B.处理
C.数据存储
D.外部项
最新试题
(10分)在SQL Server 2008数据库中存在销售单据明细表,其建表语句为:在系统运行一段时间后,此表中有近千万
(10分)设在SQL Server 2008某数据库中有汽车表和销售表,表的定义如下:PRIMARYKEY(汽车型号,销
(10分)假定我们要为某社交平台建立一个数据库,存储如下信息:·每个用户有用户编号、姓名、手机号;·每个群有群编号,群名
在企业数据仓库架构中,操作型数据存储ODS一般情况下主要用来支持即时OLAP和全局型【15】两类应用。
在数据仓库环境中,数据的【14】设计是一种重要的设计问题,它会影响到数据仓库中数据量以及系统能回答的查询的类型。
在分布式数据库系统中,为了保证全局事务的原子性,参与事务执行的所有场地或者全部提交,或者全部【13】。
事务内部故障可以分为预期的和非预期的,并发死锁故障属于【12】的事务内部故障。
增加冗余列的调优方法是典型的以空间换【11】的调优方法。
【10】视图是一种保存了查询结果的数据库对象,其中的数据是预先计算并保存在对象中的。
在SQL Server 2008中,若要删除U1登录账户,请补全下列语句:DROP【9】U1
