2015计算机三级《数据库技术》考前冲刺试题(3)
40在数据库系统出现系统故障后进行恢复时,对于事务T,如果日志文件中有BEGIN TRANSACTION记录,而没有COMMIT或ROLLBACK记录,则数据库管理系统处理这种事务时应执行的操作是【11】。
参考解析:UNDO
【解析】系统故障造成数据库状态不一致的原因有两个,一是未完成的事务对数据库的更新可能已写入数据库,二是已提交事务对数据库的更新可能还留在缓冲区没来的及写入数据库。对于故障发生前已提交的事务(既有BEGIN Transaction,又有commit)做red0操作,对于故障发生时尚未完成的事务(只有BEGINTransaction,而没有commit或rollback)做und0操作。
41在动态转储中,利用转储文件只能将数据库恢复到转储过程中的某个状态,且转储文件中的数据可能不一致,只有和【12】文件综合起来使用,才能将数据库恢复到一致状态。
参考解析:日志
【解析】数据转储是数据库恢复中采用的基本技术。所谓转储即DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。动态转储是指在转储过程期间允许对数据库进行存取或修改,即转储和用户事务可并发执行,但在转储数据后,副本上的数据并不能保证正确有效,为此必须把转储期间各事务对数据库的修改活动登记下来,建立日志文件。
42通常数据库的转储机制有三种,分别是完全转储、差量转储和【13】转储。
参考解析:增量
【解析】数据库的转储机制一般有完全转储、差量转储和增量转储三种。完全转储是指对整个数据库中的数据全部重新备份,效率低,时问长;差量转储指基于上一次完全转储基点之后变化转储,是对上次转储之后对所有文件中修改或删除的记录的转储,效率高,时问短;增量转储是对数据库中凡是有记录变化的文件的整个文件进行复制,效率介于前两种转储方式之间。
43数据仓库是面向主题的、【14】的、非易失的、随时间变化的数据集合,用来支持管理人员的决策。
参考解析:集成
【解析】数据仓库是为了构建新的分析处理环境而出现的一种数据存储和组织技术,基本特征包括:数据是面向主题的、集成的、非易失的、随时间不断变化的数据集合,用来支持管理人员的决策。
44在数据仓库设计和建设过程中,设计者需要调查用户的决策或数据处理需求,并将功能相近且需要相关联数据支持的需求进行归类,得到不同的需求集合,并在企业数据模型中寻找能够满足各个需求集合的数据集合,然后针对各个数据集合开展数据仓库数据模型的设计。这种设计方法称为【15】的设计方法。
参考解析:面向主题
【解析】面向主题的数据组织方式,就是在较高层次上对分析对象数据的一个完整并且一致的描述,能刻画各个分析对象所涉及的企业各项数据,以及数据之间的联系。所谓较高层次是相对面向应用的数据组织方式而言的,即按照主题进行数据组织的方式具有更高的数据抽象级别。与传统数据库面向应用进行数据组织的特点相对应,数据仓库中的数据面向主题进行组织。例如,一个生产企业的数据仓库所组织的主题可能有产品订货分析和货物发运分析等。
三、设计与应用题
45某书店采用了SQL Server 2008数据库管理系统,该书店有一个需求,需要统计指定年份中每一本书的销售总额,例如:查询2012年所有书的销售总额。
已知图书结构如下:
图书表(书号BOOK_ID,书名BOOK_NAME,单价BOOK_PRICE)
销售表(书号BOOK_ID,销售时间SALE_TIME,销售数量SALE_NUM)。
假设单价和销售数量均为int型,书号和书名均为varchar(50)类型,销售时问为datetime型。请给出满足如下要求的多语句表值函数,该函数统计指定年份中每本书的销售总额。(10分)设函数名为:BOOK_PROFIT(@year int),函数的返回结果格式如下:
书号销售总额
B001 60000
A004 50000
参考解析:
【解题思路】
采用JOIN联合查询,先用WHERE条件查出符合销售时间=@year的记录,再将找出的记录和图书表合并,并采用单价*销售数量计算出联合查询的表数据,最后根据GROUP BY统计每种书的销售价格总和。
【参考答案】
CREATE FUNCTION BOOK_PROFIT(@year int)
RETURNS@f_BOOK_PROFIT table(
书号varchar(50),
销售总额int)
AS
BEGIN
INSERT INTO@f_BOOK_PROFIT
SELECT a书号,SUM(a单价*b销售数量)
FROM图书表a JOIN销售表b ON a书号=b书号
WHERE year(b销售时间)=@year
GROUP BY a.书号
RETURN
END
或者
CREATE FUNCTION BOOK_PROFIT(@year int)
RETURNS@f_BOOK_PROFlT table(
BOOK_ID varchar(50),
PROFIT int)
AS
BEGIN
INSERT INTO@f_BOOK_PROFIT
SELECT a.BOOK_ID,SUM(a.BOOK_PRICE*b,SALE_NUM)
FROM BOOK a JOIN SALE b ON a.BOOK ID=b.B00K ID
WHERE year(bSALE_TIME)=@year
GROUP BY a.BOOK_ID
RETURN
END
46某商场商品经营管理系统使用SQL Server 2008数据库管理系统,此系统上线运行1年后,业务人员使用某统计功能(此功能每月使用一次)时发现速度很慢。该统计功能主要执行的SQL语句如下:
SELECT商品号,SUM(销售数量*销售价格)销售额
FROM销售明细
GROUP BY商品号;
该销售明细表的建表语句如下:
CREATE TABLE销售明细(
序列号intIDENTITY(1,1)NOT NULL,
商品号intNOT NULL,
销售日期datetime NULL,
销售数量intNOT NULL,
销售价格intNOT NULL
);
并在销售明细表上建有如下索引:
CREATE index ix_销售明细_商品号on销售明细(商品号);
某技术人员提出通过执行下述语句以提高此查询的运行效率:
CREATE VIEW商品销售额视图
WITH SCHEMABINDING
AS
SELECT商品号,SUM(销售数量*销售价格)销售额,
COUNT_BIG(*)cnt
FROM db0.销售明细
GROUP BY商品号;
CREATE UNIQUE CLUSTERED INDEX ix_商品销售额
ON商品销售额视图(商品号);
(1)请分析该技术人员给出的语句功能以及对原有查询语句的性能影响,并给出原因。
(2)此商场的销售量很大,每天有大量数据插入到销售明细表中。请从数据库整体性能角度分析,此技术人员提出的优化方法是否合适,并给出原因。
参考解析:
(1)【解题思路】
该技术人员使用了带有索引的视图,将所关心的数据(商品号,销售额,该商品号在表中出现的次数)从销售明细表中提取出来建立视图,并对该视图建立按商品号排序的聚簇索引,这样大大减少了在搜索不同商品的销售额时调用的数据表的规模,从而提高了查询效率。由于表的数据规模很大,建立该视图后,同一种商品不会多次出现在表中,而是通过一个计数变量cnt表示,即在检索时大大减少了检索规模。创建索引时,UNIQUE关键字表明此索引的每一个索引值只对应唯一的数据记录。CLUSTER表示要建立的索引是聚簇索引(所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织)。
【参考答案】
语句功能:建立包含所关心数据(商品号,销售额,该商品号在表中出现的次数)的带索引的视图,并建立按商品号对应销售额UNIQUE聚簇排序的索引,从而大大缩小了查询语句的查询范围,提高了查询效率。
原因:视图问接相关的属性列(序列号,销售日期,商品号,销售数量,销售价格)转换成了目标属性列,减少了搜索空问,同时建立UNIQUE CLUSTERED索引,使查询商品号的数据记录唯一,因此降低了搜索范围,提高了搜索效率。
(2)【解题思路】
由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。而用户通过视图对数据进行增加、删除、修改时,有意或无意地对不属于视图范围内的基本表数据进行操作,会破坏数据的一致性。而且视图中的数据本身就是冗余的,每次对表进行修改时,同时也要对相应的视图进行修改,这大大增加了系统的负担。
【参考答案】不合适,每天大量的插入操作使得在修改表的同时也要对视图进行修改,增加了系统的负担,然而该统计功能一个月才用一次,这样导致系统的利用率也较为低下。
47设有图书管理数据库,包含三张表:
图书明细表(图书编号,图书类别,图书名称,作者,出版社,出版日期,定价);
读者表(借书证号,姓名,系别,办证日期);
借出信息表(借出编号,借书证号,图书编号,借书日期);
完成下列操作:
定义一个多语句表值函数,用于查询学生借书情况,只需提供参数:借书证号,就可以通过调用函数返回此学生的借书情况,若有借书籍,则返回所借书籍的编号、书籍名称、定价和借书日期;若没有在借书籍,则返回记录为空。设函数名为:f_BorrowBook(@jszh char(20))。
参考解析:
【解题思路】
SQL Server 2008多语句表值函数的格式为:
CREATE FUNCTION[schema_name.]function_name
([{@parameter_name[As][type_schema_name.]parameter data_type
[=default]}
[….n]
]
)
RETURNS@return_variable TABLE
[AS]
BEGIN
function_body
RETURN
END
[;]
::=
({I}
[table_constraint][,...n])
采用三表联合查询,通过传入的借书证号查出借出信息表中的图书编号,然后查出图书明细表的信息。
【参考答案】
CREATE FUNCTION BorrowBook(@jszh char(20))
RETURNS@jsqkb TABLE(书籍编号char(20),书籍名称char(50),定价float,借书日期datetime)
AS
BEGIN
INSERT@jsqkb
SELECT图书明细表.图书编号,图书名称,定价,借出信息表.借书日期FROM借出信息表,图书明细表
WHERE借出信息表.图书编号=图书明细表.图书编号AND借出信息表.借书证号=@jszh
RETURN
END