资源描述
设计与应用题
1、设某教学管理系统,其查询模块需要提供如下功效:
Ⅰ.查询系信息,列出各系编号、系名和系办公电话;
Ⅱ.查询某系教师的信息,列出教师号、教师名、工资和聘任日期;
Ⅲ.查询某教师讲授的课程信息,列出课程号、课程名和学分;
Ⅳ.查询讲授某门课程的教师信息,列出教师名和职称;
Ⅴ.查询某门课程的先修课程信息,列出先修课程号和先修课程名。
系统有如下业务规则:
Ⅰ.一个系可聘任多名教师,一名教师只能受聘于一个系;
Ⅱ.一名教师可讲授多门课程,一门课程可由多名教师讲授;
Ⅲ.一门课程能够有多门先修课程,也能够没有先修课程。
(1)请依照以上查询功效与业务规则,用ER图描述该系统的概念模型。(5分)
(2)将ER图转换为满足3NF的关系模式,并阐明每个关系模式的主码和外码。(5分)
(1)【解题思绪】
E-R图也称实体-联系图,提供了表示实体类型、属性和联系的措施,用来描述现实世界的概念模型。为了简化E-R图的处置,现实世界的事物能作为属性看待的则尽也许作为属性看待。实体与属性的划分给出如下两条规则:①作为"属性",不能再具备需要描述的性质,"属性"必须是不可分的数据项,不能包括其他属性。②"属性"不能与其他实体有联系,即E-R图中所示的联系是实体之间的联系。本题中一个系能够聘任多名教师,一名教师只能受聘于一个系,因此系实体与教师实体有联系;一名教师能够讲授多门课程,一门课程可由多名教师讲授,因此教师实体与课程实体有联系,一门课程能够有多门先修课程,因此课程间也有联系。
(2)【解题思绪】
要想使转换生成的关系模式满足3NF,则必须满足关系模式中每一个非主属性既不部分依赖于码也不传递依赖于码。
2、设有商品表(商品号,商品名,单价)和销售表(销售单据号,商品号,销售时间,销售数量,销售单价)。其中,商品号代表一类商品,商品号、单价、销售数量和销售单价均为整型。
请编写查询某年某商品的销售总毛利的存储过程,毛利=销售数量×(销售单价-单价)。要求商品号和年份为输入参数,总毛利用输出参数返回。(10分)
【解题思绪】
存储过程是由PL/SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,使用时只要调用即可。使用存储过程具备如下优点:其已经编译和优化过了,因此运行效率高,提供了在服务器端迅速执行SQL语句的有效途径;存储过程减少了客户端和服务器之间的通信量;以便实行企业规则,当企业规则发生变化时只要修改存储过程,而无需修改其他应用程序。
创建存储过程:
create procedure 过程名
@[参数名] [类型],@[参数名] [类型] /*过程首部*/
As
Declare/*as下面对应的<PL/SQL>块为过程体*/
……….
begin
.........
end
如上所示,存储过程包括过程首部和过程体。过程名是数据库服务器合法的对象标识;参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数能够是输入参数或输出参数,默以为输入参数。
3、设某全国性的运输企业建立了大型OLTP系统,并在该系统之上建立了数据仓库。OLTP系统和数据仓库中有如下数据表:
运输明细表(运输单ID,发送站ID,终到站ID,货物ID,货物重量,运输价格,发货日期)
汇总表1(发送站ID,终到站ID,货物ID,发货日期,总重,总运价)
汇总表2(发送站ID,终到地区ID,货物ID,发货日期,总重,总运价)
汇总表3(发送站ID,终到站ID,货物ID,发货月份,总重,总运价)
汇总表4(发送地区ID,终到地区ID,货物类别ID,发货日期,总重,总运价)
该企业管理的货运站约有100个,货物约有500种共10类,各汇总表都建有主码,且各表有合理的维护方略,在每次维护后数据能保持一致。设有视图V,该视图的访问频率很高,其查询成果模式为(发送地区ID,终到站ID,发货月份,总重,总运价),该视图现以汇总表1为计算数据源。经监控发觉,汇总表1的被访问频率过高,导致系统整体性能下降,而其他汇总表被访问频率较低。在不增加汇总表和索引的情况下,请给出一个改进系统服务性能的优化方案,并简明阐明理由。(10分)
【解题思绪】
计算机系统中存在着两类不一样的数据处理工作:操作型处理和分析型处理,也称作OLTP(联机事务处理)和OLAP(联机分析处理)。操作型处理也叫事务处理,是指对数据库联机的日常操作,一般是对一个或一组纪录的查询或修改,例如火车售票系统、银行通存通兑系统、税务征收管理系统等。这些系统要求迅速响应用户祈求,对数据的安全性、完整性以及事务吞吐量要求很高。结合本题中存在的问题,视图自身的访问量很高,而又仅仅以汇总表1为计算数据源,而其他汇总表访问率低,导致了资源利用不合理。因此本题考查了联机事务处理中的资源调度问题。
4、设在SQL Server某数据库中有商品表和销售表,两个表的定义如下: (新增题库一)
CREATE TABLE 商品表(
商品号 char(10) PRIMARY KEY,
商品名 varchar(40),
类别 varchar(20),
进货单价 int );
CREATETABLE 销售表(
商品号 char(10) REFERENCES 商品表(商品号),
销售时间 datetime,
销售数量 int,
销售单价 int,
PRIMARYKEY(商品号,销售时间) );
现要创建一个存储过程:查询指定类别的每种商品目前年销售总金额(销售总金额=销售单价* 销售数量)。请补全下列代码。
CREATEPROC p_TotalProfit
@lb varchar(20)
AS
SELECT 商品名,(SELECTFROM 销售表 t1 WHEREand= year(Getdate())) AS 销售总金额
FROM 商品表 t2 WHERE
【解题思绪】
①整个select语句的含义是:依照where子句的条件体现式,从From子句指定的基本表或视图中找出满足条件的元组,再按select子句中的目标列体现式,选出元组中的属性值形成成果表。
②该题中(SELECT FROM 销售表 t1 WHERE and = year(Getdate()))是个嵌套,别名叫做销售总金额。
③语句执行过程:
•先从商品表中按照第二个where形成一个初步查询成果。因为只有商品表中有类别,因此可知第四空填写:t2.类别=@lb(t2是商品表的别名,t1是销售表的别名)。由此可知该步是按给定类别查询。
•销售总金额语句就应当在第一部的基础上求某年的总额。因此能够推断第三空是取得销售时间语句。因此该空填写t1.销售时间。因为是在第一步基础上的查询,因此应当实行连表查询,第二空应当填写连接的条件,即t1.商品号=t2.商品号。
•第一空应当是求总额的语句。销售总金额=销售单价* 销售数量,即销售单价*SUM(销售数量)。
【参考答案】
【第1空】销售单价*SUM(销售数量)
【第2空】t1.商品号=t2.商品号
【第3空】t1.销售时间
【第4空】t2.类别=@lb
5、设某超市经营管理系统使用SQL Server 数据库管理系统,此数据库服务器有2颗CPU、16GB内存、2TB磁盘。上线运行1年后,用户在生成天天每个销售人员及每个收银台的总销售额报表时速度迟缓。经技术人员分析,发觉速度迟缓的原因为销售单据表和销售单据明细表数据量共计已经达成60GB。已知这两个表结构如下:
销售单据表(销售单据编号,销售时间,销售人员编号,收银台编号)
销售单据明细表(销售单据编号,商品编号,单价,数量)
在进行此报表计算时数据库服务器CPU消耗非常高。为了优化此操作,某工程师提议在销售单据表中增加"付款总金额"属性,取值由触发器自动计算。请从磁盘空间使用、销售操作时对数据库服务器的影响、数据一致性以及对总销售额计算速度影响方面分析此方案优劣。请判断此方案是否可行,并从时空代价和优化效果方面分析原因。
【解题思绪】
在数据库设计阶段,重要强调的是高效率利用存储空间,减少数据的冗余,减少数据的不一致性,这个过程也就是规范化的过程。不过在数据库运行阶段要考虑到高效率的进行数据处理。
完全规划化的数据库会产生诸多表,对于一个频繁使用的查询,假如它要求操作多个有关表中的数据,则每次为生成需要的查询成果而在连接多个表中有关行时,数据库管理系统就会消耗更多的计算资源,因为连接操作非常耗时。
而反规范化是将规范化的关系转换为非规范化的关系的过程,目标是提升查询的效率。常见的措施有增加派生冗余列,增加冗余列,重新组表,分割表和新增汇总表等措施。
该题处理的方式就是增加派生冗余列--"付款总金额"。派生性冗余列是指表中增加的列由表中的某些数据项通过计算而成,它的作用是查询时减少连接操作,防止使用聚合函数。例如销售单据明细表(销售单据编号,商品编号,单价,数量)中增加"付款总金额",因为付款总金额=单价*数量得到,阐明"付款总金额"是派生性冗余列。假如不要该字段,那么每次使用总价时,都要先执行代码计算后才能使用,假如商品数量较多,并且要频繁使用"付款总金额"时,计算"付款总金额"时执行的次数也会伴随增加,这显然会影响数据库的执行效率。若增加"付款总金额"这个派生性冗余字段,虽然破坏了规范化标准,但只要执行一次计算"付款总金额"就能够把商品金额存在数据库中,以后无论什么时候使用"付款总金额"字段,只需要提取其值就能够了,无须在执行代码了。因此增加"付款总金额",虽然提升了磁盘空间的使用,不过能够提升系统执行的效率,达成以空间换时间的目标。
由此能够看出,在数据单据表中增加"付款总金额"不是正确的优化措施,应当在数据单据明细表中增加"付款总金额",这么才能提升查询效率。
【参考答案】 (新增题库一)
此方案不可行。触发器能够通过数据库中的有关表进行层叠更改,这比直接把代码写在前台的做法更安全合理,确保了数据的一致性,但同时增加了磁盘空间的消耗。在超市经营中要批量操作、数次触发的情况下,触发器的效率低,因为它相称于每次都执行一段SQL语句,使cpu的消耗更高。因而从时空代价角度来说并不能达成优化的效果,故该方案不可行。
6、设某连锁商店数据库中有关系模式R:
R(商店编号,商品编号,库存数量,部门编号,责任人)
假如要求:每个商店的每种商品只在一个部门销售,每个商店的每个部门只有一个责任人,每个商店的每种商品只有一个库存数量。(10分)
(1)请依照上述要求,写出关系模式R的函数依赖集;
(2)请给出关系模式R的候选码;
(3)请阐明关系模式R属于第几范式,并给出理由;
(4)请将R分解成满足3NF的关系模式。
(1)【解题思绪】
函数依赖定义:设R(U)是属性集U上的关系模式,X,Y是U的子集,若对于R(U)的任意一个也许的关系r,r中不也许存在两个元组在X上的属性值相等,在Y上的属性值不等,则称X函数确定Y或Y函数依赖X,记作X->Y。函数依赖是指关系R的一切关系均要满足的约束条件。
(2)【解题思绪】
设K为R<U,F>中的属性或属性组合,若U完全依赖于K,则K为R的候选码。
(3)【解题思绪】
关系数据库是要满足一定要求的。满足最低要求的叫第一范式,在第一范式中满足深入要求的为第二范式,其他以此类推。显然该关系模式满足第一范式,接下来检查其是否满足第二范式。在第二范式中,要求关系模式中不存在部分依赖,每一个非主属性完全依赖于码,而依照第一空可得如下依赖关系:(部门编号,商店编号)->责任人,因此属于第一范式。它的非主属性有3个(不包括在任何候选码中的属性):部门编号、责任人、库存量,并都完全函数依赖于主码。将(商店编号、商品编号)记作X,(商店编号、部门编号)记作Y,责任人记作Z,由此能够看出,存在传递依赖,故不属于第三范式。
(4)第三范式中要求每一个属性既不部分依赖于码也不传递依赖于码。
7、在某数据库中,有关表的建表语句如下: (新增题库二)
create tableT1(
a1 int primary key,
a2 int,
a3 int foreign key references T2(a3));
create tableT2(
a3 int primary key,
a4 int,
a5 int foreign key references T2(a3));
create tableT3(
a1 int,
a3 int,
a6 int,
primary key (a1, a3),
a1 foreign key references T1(a1),
a3 foreign key references T2(a3));
请画出对应的E-R图,使得能够从该E-R图推导出上述表定义,其中实体和联系的名称能够自定,实体的主码属性请使用下划线标明。
【参考答案】
(新增题库二)
8、设某超市经营管理系统使用SQL Server 数据库管理系统。为了确保数据库可靠运行,数据库管理员设置了天天夜间对数据库一次全备份,备份数据保存2个月的备份方略。上线运行1年后,SQL Server数据库中数据已经达成近200GB。天天夜间要运行3个小时才能将数据库进行一次全备份,影响了夜间统计等业务正常运行。同时,备份空间也非常担心。请解释出现此现象的原因,并提出优化的措施。
【参考答案】
产生此现象的原因是系统采取了全备份方略,伴随业务的开展,需要备份数据量逐渐增大,备份时间越来越长,占用了系统的资源,从而影响了其他业务。处理的措施是采取全备份+差异备份+日志备份组合方略备份数据库。全备份+差异备份+日志备份组合方略是指在全备份中加某些差异备份,例如每七天日0:00进行一次全备份,然后天天0:00点进行一次差异备份,然后再两次差异备份之间增加某些日志备份。这么做备份和恢复的速度都比较快,而当系统出现故障时,丢失的数据也极少。
备份示意图如下:
假如系统在周二的差异备份之前出现故障,则应首先尝试备份活动日志(日志尾部),然后再按次序恢复全备份1,差异备份1,日志备份3和日志备份4,然后再恢复备份的尾部日志。假如尾部日志备份成功,则数据库能够还原到故障点。
这种备份方略虽然备份频率高,不过备份时间短,占用的备份空间也小,并且不会产生数据丢失。
假如系统在周二的差异备份之前出现故障,则应首先尝试备份活动日志(日志尾部),然后再按次序恢复全备份1,差异备份1,日志备份3和日志备份4,然后再恢复备份的尾部日志。假如尾部日志备份成功,则数据库能够还原到故障点。
这种备份方略虽然备份频率高,不过备份时间短,占用的备份空间也小,并且不会产生数据丢失。
1、设有商品表(商品号,商品名,单价)和销售表(销售单据号,商品号,销售时间,销售数量,销售单价)。其中,商品号代表一类商品,商品号、单价、销售数量和销售单价均为整型。
请编写查询某年某商品的销售总毛利的存储过程,毛利=销售数量×(销售单价-单价)。要求商品号和年份为输入参数,总毛利用输出参数返回。(10分)
CREATE PROCEDURE PRODUCT @商品号 int,@年份 int,@毛利 int output
AS
DECLARE
@某商品销售量 int,@某商品进价 int,@某商品销售单价 int /*中间变量定义*/
BEGIN
Select @某商品进价=单价 from 商品表 where @商品号=商品号
Select @某商品销售单价=销售单价,@某商品销售量=count(*) from 销售表 where
@商品号=商品号 and 销售时间=@年份
IF @某商品进价 is NULL THEN /*判断该商品是否存在*/
ROLLBACK;
RETURN;
END IF
IF @某商品销售单价 is NULL THEN /*判断该商品是否可卖*/
ROLLBACK;
RETURN;
END IF
SET @毛利=(@某商品销售单价-@某商品进价)*@某商品销售量
GO
2、在SQL Server 中,设某数据库中有商品表(商品号,商品名,进货价格),商品号为主码;销售表(商品号,销售时间,销售数量,销售价格,本次利润),商品号和销售时间为主码,销售价格为本次销售商品的单价。现要求每当在销售表中插入前4列数据时(假设一次只插入一行数据),系统自动计算本次销售产生的利润,并将该利润赋给销售表的第5列"本次利润"。请编写实现上述功效的后触发型触发器代码。(10分)
CREATE TRIGGER calcu_product
AFTER INSERT ON 销售表
FOR EACH ROW
AS BEGIN
DECLARE @PurchasePrise float /*对应商品的进价的参数*/
SELECT @PurchasePrise=进货价格 FROM 商品表 WHERE 商品号=new.商品号
UPDATE 销售表 SET 本次利润=new.销售数量*(new.销售价格-@PurchasePrise) WHERE 商品号=new.商品号AND 销售时间=new.销售时间
/*因为是行级触发器,因此能够使用更新后的新值,用new*/
END
3、设在SQL Server 某数据库中,已建立了四个文献组:fg1、fg2、fg3和fg4,以及一个分区函数RangePF1。RangePF1的定义代码如下:
CREATE PARTITION FUNCTION RangePF1(int)
AS RANGE LEFT FOR VALUES(100,200,300)
(1) 请基于RangePF1创建一个分区方案RangePS1,每个分区对应一个文献组。(5分)
create partition scheme RangePS1
as partition RangePF1
to (fg1, fg1, fg1, fg2)
(2)请使用RangePS1创建一个分区表PartitionT(Gid, GoodName, Price),该表基于Gid列创建分区。其中Gid:int类型,取值不小于等于1;GoodName:统一字符编码可变长类型,最多可存储20个中文;Price:定点小数类型,小数部分1位,整数部分到千位。(5分)
创建分区表:
create table orders
(
GID int identity(1,1) primary key,
GoodName varchar(40),
Price float
)
on RangePS1(GID)
4、 设在SQL Server 某数据库中有商品表和销售表,两个表的定义如下:
CREATE TABLE 商品表(
商品号 char(10)PRIMARY KEY,
商品名 varchar(40),
类别 varchar(20),
进货单价 int )
CREATE TABLE 销售表(
商品号 char(10),
销售时间 datetime,
销售数量 int,
销售单价 int,
PRIMARY KEY(商品号,销售时间))
下面是一个用户定义的多语句表值函数,它接收类别作为输入参数,返回该类别下的每种商品在的销售总利润,并将成果按照销售总利润的降序输出。请补全该函数定义代码。(10分)
CREATE FUNCTION f_Profit (@lb char(10)) 【1】@ProfitTable【2】(
商品号 char(10),
总利润 int )
AS
BEGIN
INSERT INTO @ProfitTable
【3】
【4】
END
第一空:RETURNS
第二空:table
第三空:
a SELECT a.商品号,SUM(销售数量*(销售单价-进货单价)) AS总利润 FROM 销售表 a JOIN商品表b ON a. 商品号=b. 商品号 WHERE a.商品号 IN(SELECT 商品号 FROM 商品表 WHERE 类别=@lb) GROUP BY a. 商品号ORDER BY 总利润 DESC
第四空:RETURN@Rrofit Table
5、设有图书管理数据库,包括三张表:
图书明细表(图书编号,图书类别,图书名称,作者,出版社,出版日期,定价);
读者表(借书证号,姓名,系别,办证日期) ;
借出信息表(借出编号,借书证号,图书编号,借书日期);
完成下列操作:(10分)
定义一个多语句表值函数,用于查询学生借书情况,只需提供参数:借书证号,就能够通过调用函数返回此学生的借书情况,若有借书籍,则返回所借书籍的编号、书籍名称、定价和借书日期;若没有在借书籍,则返回统计为空。设函数名为:f_BorrowBook(@jszh char(20))。
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
6、某书店采取了SQL Server 数据库管理系统,该书店有一个需求,需要统计指定年份中每一本书的销售总额,例如:查询所有书的销售总额。
已知图书结构如下:
图书表(书号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
… …
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
7、设在采取SQL Server 数据库的图书馆应用系统中有三个基本表,表结构如下所示,请用SQL语句完成下列两个查询:
(1)SELECT LOANS.借书证号,姓名,系名,COUNT(*) AS 借书数量
FROM BORROWER,LOANS
WHERE BORROWER.借书证号=LOANS.借书证号
GROUP BY LOANS.借书证号
HAVING COUNT(*)>=5;
(2)SELECT 姓名,系名,书名,借书日期
FROM BORROWER,LOANS , BOOKS
WHERE
BORROWER.借书证号=LOANS.借书证号 AND LOANS.图书登记号=BOOKS.图书登记号
AND 索书号 IN
(
SELECT 索书号 FROM BORROWER,LOANS,BOOKS
WHERE BORROW.借书证号=LOANS.借书证号
AND LOANS.图书馆登记号=BOOKS.图书登记号
AND 姓名="王丽"
)
8、设某全国性的运输企业建立了大型OLTP系统,并在该系统之上建立了数据仓库。OLTP系统和数据仓库中有如下数据表:
运输明细表(运输单ID,发送站ID,终到站ID,货物ID,货物重量,运输价格,发货日期)
汇总表1(发送站ID,终到站ID,货物ID,发货日期,总重,总运价)
汇总表2(发送站ID,终到地区ID,货物ID,发货日期,总重,总运价)
汇总表3(发送站ID,终到站ID,货物ID,发货月份,总重,总运价)
汇总表4(发送地区ID,终到地区ID,货物类别ID,发货日期,总重,总运价)
该企业管理的货运站约有100个,货物约有500种共10类,各汇总表都建有主码,且各表有合理的维护方略,在每次维护后数据能保持一致。设有视图V,该视图的访问频率很高,其查询成果模式为(发送地区ID,终到站ID,发货月份,总重,总运价),该视图现以汇总表1为计算数据源。经监控发觉,汇总表1的被访问频率过高,导致系统整体性能下降,而其他汇总表被访问频率较低。在不增加汇总表和索引的情况下,请给出一个改进系统服务性能的优化方案,并简明阐明理由。(10分)
因为汇总表1和视图的模式访问频率都很高,并且视图的数据源来自汇总表1,又因为其他汇总表的访问率较低,因此只需要将视图的数据源绑定为汇总表3,因为汇总表3也能够满足视图的输出模式。这么不但提升了汇总表3的数据访问率,并且减少了汇总表1的数据访问率,系统性能和服务性能得到了很大的优化。又因为货物约有500种,共10类,能够再建立一个视图绑定数据源为汇总表4,这么就能够充足利用汇总表4的数据信息,从而能够深入优化系统性能。
9、在进行某学校教务管理系统的数据库设计时,数据库设计人员设计了如下几个关系模式:
系(系号,系名),系号为主码
学生(学号,姓名,所在系号),学号为主码
课程(课程号,课程名,开课系号),课程号为主码
选课(学号,课程号,选学时间),学号和课程号为主码(8分)
开发人员在将关系模式实行到SQL Server 的"教务"数据库时,使用了如下表结构定义语句:
CREATE TABLE 系 (
系号 varchar(10) NOT NULL ,
系名 varchar(100)
)
CREATE TABLE 学生 (
学号 varchar(50) NOT NULL ,
姓名 varchar(50),
所在系号 varchar(10)
)
CREATE TABLE课程 (
课程号 varchar(50) NOT NULL ,
课程名 varchar(100),
开课系号 varchar(10)
)
CREATE TABLE 选课 (
学号 varchar(50) NOT NULL ,
课程号 varchar(50) NOT NULL ,
选学时间 datetime
)
在执行如下查询语句时发觉执行效率很低:
SELECT * FROM 选课 JOIN 学生 ON 学生.学号 = 选课.学号
JOIN 系 ON 系.系号 = 学生.所在系号
JOIN 课程 ON 课程.课程号 = 选课.课程号
WHERE 系.系号=′012′
AND convert(varchar(10),选学时间,120) >= ′-01-01′
(1)在查找原因时发觉建表语句有问题。请指出问题并阐明该问题是否会影响此查询语句的执行效率。(4分)
(2)设已在"选课"表的"选学时间"列及"学生"表的"所在系号"列上建立了索引。请问这两个索引是否能够提升该查询语句的执行效率?假如不能,请阐明原因。(4分)
建表时没有设置主键,也没有阐明外键,但不会影响此查询语句的执行效率。
"选课"表的"选学时间"能够建立索引,从而提升查询效率,而"学生"表的"所在系号"建立索引不会提升查询效率。索引的意义就是将统计按目标核心字次序排列,这么查找某个目标核心字的对应值的位置就缩小了查找范围。"选学时间"的重复率低,因此能够作为索引,而学生"所在系号"的重复率太高,则不会提升查询效率。
10、某商场商品经营管理系统使用SQL Server 数据库管理系统,此系统上线运行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 dbo.销售明细
GROUP BY 商品号;
CREATE UNIQUE CLUSTERED INDEX ix_商品销售额
ON 商品销售额视图(商品号);(10分)
(1) 请分析该技术人员给出的语句功效以及对原有查询语句的性能影响,并给出原因。
语句功效:建立包括(商品号,销售额,该商品表中出现次数)带索引的视图,并建立按商品号对应销售额UNIQUE聚簇排序的索引,大大缩小了查询语句的查询范围,提升了查询效率。原因:视图中将间接有关的属性列(序列号,销售日期,商品号,销售数量,销售价格)转换成了目标属性列,减少了搜索空间;同时建立UNIQUE CLUSTERED索引,使查询商品号的数据统计唯一,减少了搜索范围,提升了搜索效率。
(2)此商场的销售量很大,天天有大量数据插入到销售明细表中。请从数据库整体性能角度分析,此技术人员提出的优化措施是否适宜,并给出原因。
不宜,天天大量的插入操作使得在修改表的同时也要对视图进行修改,增加了系统的负担,然而该统计功效一个月才用一次,这么导致系统的利用率也较为低下。
11、某教务管理系统使用SQL Server 数据库管理系统,数据库软硬件配备信息如下:
Ⅰ.数据库运行在两路Intel Xeon E5-2609 2.4GHz CPU(每路CPU4核心),128GB内存、2块300GB 15000转SAS硬盘(RAID 1)的服务器上;
Ⅱ.服务器操作系统为Windows 32位企业版,安装SP2补丁;
Ⅲ.数据库为SQL Server Enterprise(32 位),数据库中总数据量近130GB。
近一个学期以来,用户反应系统运行迟缓,经程序员定位,确定为数据库服务器响应迟缓,需要进行调优。(10分)
依照SQL Server 数据库的特性以及题目中的条件,综合给出如下的调优方案。
(1) 表结构优化:重新优化数据库设计结构,规范数据库逻辑设计;设计主键和外键;设计适宜大小的字段。
(2) 硬件优化:购置一块同样大小的硬盘,将硬盘做成RAID5,用以提升数据库读写速度;增加服务器 CPU个数;扩大服务器的内存。
(3) 索引优化:采取对常常作为条件查询的列设计索引,在查询中常常用到的列上建立非聚簇索引,在频繁进行范围查询、排序、分组的列上建立聚簇索引,对于有频繁进行删除、插入操作的表不要建立过多的索引。
(4)采取视图:合理使用视图和分区视图,在需要更新和删除操作不多、查询操作频繁的表上建立索引视图。
(5) SQL语句优化:选择运算应尽也许先做,并在对同一个表进行多个选择运算时,选择影响较大的语句放在前面,较弱的选择条件写在背面,这么就能够先依照较严格的条件得出数据较少的信息,再在这些信息中依照背面较弱的条件得到满足条件的信息。应防止使用有关子查询,把子查询转换成联结来实现。字段提取按照"需多少,提多少"的标准,防止"SELECT *","SELECT *"需要数据库返回对应表的所有列信息,这对于一个列较多的表无疑是一项费时的操作,采取存储过程,使用存储过程提升数据处理速度。
12、某采购中心采购了一套商品批发查询管理系统,此系统采取SQL Server 数据库管理系统,该系统需要常常处理百万级以上的数据查询。同时该系统提供了第三方人员开发的SQL接口,第三方人员能够依照自己的需要开发自己的应用程序来访问数据库中的有关数据。(10分)
(1)系统在使用的过程中,业务人员反应系统操作速度很慢。通过工程师检查测试后,数据库系统自身及网络传输过程中存在着某些问题,请给出针对数据库系统自身及网络传输过程中也许的某些调优方案。
(2)工程师在完成数据库系统自身和网络问题的优化后,发觉第三方开发人员的SQL查询语句存在诸多没有优化的问题,请从第三方开发人员角度给出某些优化方案。
(1)①把数据、日志、索引放到不一样的I/O设备上,增加读取速度,数据量(尺寸)越大,提升I/O越重要。
②纵向、横向分割表,减少表的尺寸。
③升级硬件,扩大服务器的内存,Windows 和SQL Server 能支持4-8G的内存。配备虚拟内存,虚拟内存大小应基于计算机上并发运行的服务进行配备。增加服务器 CPU个数。
④ 分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过度区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。
⑤ 重建索引:DBCC REINDEX ,DBCC INDEXDEFRAG;收缩数据和日志:DBCC SHRINKDB,DBCC SHRINKFILE。设置自动收缩日志,对于大的数据库不要设置数据库自动增加,它会减少服务器的性能。
⑥ 优化锁结构。
(2)
①对查询进行优化,尽也许防止全表扫描,首先应考虑在 where 及 order by 包括的列上建立索引。
②应尽也许防止在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
③任何地方都不要使用 select * from 进行全表扫描 ,用详细的字段列替代"*",不要返回冗余字段。
④防止频繁创建和删除暂时表,以减少系统表资源的消耗。
⑤尽也许防止使用游标,因为游标的效率较差,假如游标操作的数据超出1万行,那么就应当考虑改写。
⑥尽也许防止大事务操作,提升系统并发能力。
13、6-3数据库管理系统。此系统上线运行前,需将商场原有的数据导入到新系统中。原有系统使用SQL Server ,数据结构与新系统不完全一致。因此需要把数据从SQL Server 导入到SQL Server 中,为了确保数据一致性,数据导入过程中要求暂停业务且必须在3小时内完成
展开阅读全文