数据库实验报告4《数据库原理》实验报告题目:实验四视图与索引学号姓名班级日期Xxxx Xx xxxxx 2016.10.20一. 实验内容、步骤以及结果1.在Student数据库中,利用图形用户界面,创建一个选修了“数据库原理”课程并且是1986年出生的学生的视图,视图中包括学号,性别,成绩三个信息。
2.用两种不同的SQL语句创建第五版教材第三章第9题中要求的视图(视图名:V_SPJ)方法一:create view V_SPasselect sno,pno,qtyfrom spjwhere spj.jno in(select jno from j where j.jname='三建')方法二:create view V_SPJasselect sno,pno,qty from spj,jwhere j.jno=spj.jno and j.jname='三建'INTO V_SPJ(SNO,PNO,QTY)VALUES( 's5','p3',900)提示:-SPJ表中JNO允许为空时,数据可以插入基本表,此时JNO为NULL,由于JNO为NULL,所以视图中没有该条数据。
-SPJ表中JNO不能为空时,可以使用instead of触发器实现。
(1)修改视图V_SPJ中的任意一条数据的供应数量。
updateV_SPJ set qty=111where sno='s1' and pno='p1'(2)删除视图V_SPJ中的任意一条数据(注意所创建视图可以视图消解时,才能正常删除,否则会删除失败;也可以考虑用instead of触发器实现)。
DELETEV_SPJwhere sno='s1' and pno='p1' and qty=111用instead of触发器实现CREATE TRIGGER trdV_SPJON V_SPJINSTEAD OF DELETEASBEGINDelete from V_SPJWHERE sno='s1' and pno='p1' and qty=111END可以看到s1、p1、111已将被删除了3.用图形用户界面对Student数据库中C表的Cno字段创建一个降序排列的唯一索引,索引名称IX_CNo。
(5分)4.使用SQL语句对Student数据库完成以下的索引操作。
(15分,每题5分)(1)在C表的CName属性上创建一个非唯一性的聚簇索引,索引名IX_CName。
CREATE CLUSTER INDEX IX_CNameON C(CName)(提示:创建这个聚簇索引之前,需要首先删除C表的主键约束。
SQL Server中,给某张表指定主键时,会自动创建为主属性一个聚簇索引。
)(2)在SC表上创建一个名为IX_Cnosno的非聚簇复合索引,该索引是针对sno,cno属性集建立的升序索引。
CREATE INDEX IX_CnosnoON SC(sno ASC,cno ASC)(3)删除C表的索引IX_CName。
DROP INDEX IX_CName ON C5.自己设计一个实验验证索引对数据库查询效率的提升作用。
(40分)(提示:需要数据量比较大的情况下才容易进行对比)1、创建表:CREATE TABLE [dbo].[Article]([Id] [int] IDENTITY(1,1) NOT FORREPLICATION NOT NULL,[MsId] [int] NOT NULL,[Title] [nvarchar](96) NOT NULL, [TitleBak] [nvarchar](96) NOT NULL,[Summary] [nvarchar](512) NOT NULL,[SummaryImageUrl] [nvarchar](256) NOTNULL,[Tag] [nvarchar](50) NOT NULL, [ArticleChannel_Id] [int] NOT NULL, [ArticleCategory_Id] [int] NOT NULL, [IsApproved] [bit] NOT NULL,[Creator_Id] [int] NOT NULL, [CreatedDateTime] [datetime] NOT NULL, [ModifiedDateTime] [datetime] NOT NULL, [ViewCount] [int] NOT NULL, [ReplyCount] [int] NOT NULL, [DiggCount] [int] NOT NULL, [FavoriteCount] [int] NOT NULL, [LastReplyUser_Id] [int] NOT NULL, [LastReplyDateTime] [datetime] NOT NULL, [RightType] [int] NOT NULL, [IsDisplayContent] [bit] NOT NULL, [IsSensitive] [bit] NOT NULL, [Source] [int] NOT NULL,CONSTRAINT [PK_Articles]PRIMARY KEY CLUSTERED ([Id] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] )ON [PRIMARY]2、加入测试数据:DECLARE @number INTSET @number = 200000WHILE @number > 0BEGININSERT dbo.Article(MsId,Title,TitleBak,Summary,SummaryImageUrl, Tag,ArticleChannel_Id, ArticleCategory_Id, IsApproved,Creator_Id,CreatedDateTime, ModifiedDateTime, ViewCount, ReplyCount, DiggCount,FavoriteCount, LastReplyUser_Id, LastReplyDateTime, RightType, IsDisplayContent, IsSensitive,Source)VALUES(@number,'Title'+cast(@number AS VARCHAR(20)), 'TitleBak'+cast(@number AS VARCHAR(20)), 'Summary'+cast(@number AS VARCHAR(20)), 'SummaryImageUrl'+cast(@number ASVARCHAR(20)),'Tag'+cast(@number AS VARCHAR(20)),1,2,0,@number,GETDATE(),GETDATE(),100,29,123,12,@number,GETDATE(),1,0,0,2)SET @number=@number-1END创建200000条数据,每条数据包含MsId, Title, TitleBak, Summary, SummaryImageUrl, Tag, ArticleChannel_Id,ArticleCategory_Id, IsApproved,Creator_Id,CreatedDateTime, ModifiedDateTime,ViewCount, ReplyCount, DiggCount, FavoriteCount, LastReplyUser_Id,LastReplyDateTime, RightType,IsDisplayContent, IsSensitive这些属性,部分数据截图如下:3、没建立索引前,利用语句,查询开销,看执行计划SELECT CreatedDateTime,ViewCount ,title,titlebak,summary,summaryimageurlFROM ArticleWHERE Creator_Id=200000WITH TEMPAS( SELECT ROW_NUMBER()OVER (ORDER BY CreatedDateTime)AS ROW, CreatedDateTime,ViewCount ,title,titlebak,summary,summaryimageurl FROM ArticleWHERE Creator_Id=200000 )SELECT * FROM TEMPWHERE ROW BETWEEN 1 AND 30建立索引之后,再执行一次查询,执行计划如下:由此可见,有索引时,查询开销变小,查询更有效。
二. 实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)除了标题内容以外,该部分内容中还可以写对于实验的一些感受,建议,意见等。
第七题的设计实验,最初看到时,无从下手,不会创建含有大量数据的表,但数据太少,建不建立索引对于查询效率影响并不明显,后来经过查询,找到了创建的方法,并成功创建200000组数据,完成查询,通过设计实验,学到了很多书本上没有的东西。
批阅者:批阅日期:实验成绩:批注:。