DBEX-1-6-2015数据库开发技术
一、(简答题,20分)
请简要描述在DBMS中SQL语句的执行过程,并简单对各个步骤所花费的代价大小进行描述和比较
a)语法分析:判断一条SQL语句的语法是否符合SQL的规范(2)
b)语义分析:语法正确的SQL语句第二个步骤就是判断该SQL语句所访问的对象是否准确,且用户是否有相应的权限。(2)
c)解析(硬解析(3),软解析(3)
Hard Parse(硬解析):对提交的Sq完全重新从头进行解析(当在 Shared Pool中找不到时候将会进行此操作),总共有一下5个执行步骤:
1.语法分析
2.权限与对象检查
3.在共享池中检查是否有完全相同的之前完全解析好的如果存在,直接跳过4和5,运行sql,此时算软解析.
4.创建解析树,选择执行计划,这一步对于sq的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析
5.产生执行计划。
Soft parse(软解析):如果在 Shared pool中找到了与之完全相同的Sq解析好的结果后会跳过 Hard Parse中的后面的两个步骤
解析的步骤可以分为两个步骤:
1)验证SQL语句是否完全一致。
在这个步骤中, Oracle将会对传递进来的SoL语句使用HASH函数运算得出HASH值,再与共享池中现有语句的HASH值进行比较看是否一对应
2)验证SQL语句执行环境是否相同
比如同样一条SQL语句,个查询会话加了/*+ first rows*/的HNT,另外一个用户加/+aows/的HNT,他们就会产生不同的执行计划,尽管他们是查询同样的数据。通过如上检查以后,如果SQL语句是一致的,那么就会重用原有QL语句的执行计划和优化方案,也就是我们通常所说的软解析。如果SQL语句没有找到同样的副本,那么就需要进行硬解析了
Oracle根据提交的saL语句再查询相应的数据对象是否有统计信息如果有统计信息的话,那么CBO将会使用这些统计信息产生所有可能的执行计划(可能多达成千上万个和相应的Cost,最终选择cost最低的那个执行计划。如果查询的数据对象无统计信息,则按RBO的默认规则选择相应的执行计划。这个步骤也是解析中最耗费资源的。
根据解析产生的执行计划执行sq缓冲区寻找数据,或磁盘读取,逻辑读,物理读,物理写),返回结果(2)
比较下来解析耗费资源的代价最大,因此我们应该极力避免硬解析的产生(3)
B+Tree索引是大多DBMS缺省的索引类型,请详细描述以下几个问题:
1)B树索引的结构和使用方式(3)
B树索引的结构:由根指向子节点,B树将索引按顺序存储,在叶节点保存索引到字段及其对应数据在表中的位置指针。叶结点之间连续。
从根节点开始搜索,通过节点中的指针进入下一级节点,通过比较要查找的索引值和节点中的指针大小选择进入哪个子节点,最终要么找到对应叶节点,要么没找到。叶节点中有指向表中数据的指针。
2)何时该使用B树索引,并分别说明原因(3)
a、仅需要索引访问表中很少一部分行时,索引提供以原子粒度访问数据的功能,可以快速定位所查找数据的位置;
b、虽然查询行数比较多,当索引包含多个字段,而要访问的字段全部包含在索引中时,查找只需通过索引而不用访问全表时。
3)详细说明为什么系统的为外键构建索引是普遍的要求(3)
为确保数据的完整性,在对主表操作时,需要对参照表进行加锁操作。如果外键没有索引,查找子记录就会很慢,且参照表被锁的时间很长,进而使很多更改操作阻塞,甚至可能发生死锁。
进行连接查询时,如果不对外键使用索引则会发现查询的速度大大降低。引起全表扫描
4)针对3)有没有例外情况?如果有请简要说明理由(3)
不从父表中删除记录
不更新父表中的主键的值
一般不进行父表和子表的连接查询
盲目为外键加索引还可能造成索引重复
5)请描述Oracle中一种类似于B树索引结构的物理组织形式索引组织表(IOT)的基本结构和应用范围(3)
IOT
2. IOT (index organized table )索引组织表
当索引中增加额外的字段(一个或多个,它们本身与实际搜索条件无关,但包含查询所需的数据),能提高某个频繁运行的查询的速度。
IOT 存储在索引结构中的表,所有字段纳入索引,不存在主键的空间开销,允许在主键索引中存储所有数据,这个表本身就是索引
存取方式/ 访问方式
数据的存放是严格规定的, 记录的存放是排序的,查询效率非常高。数据插入以前其实就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的哪个位置与插入的先后顺序无关。这样在进行查询的时候就可以少访问很多 blocks,但是插入的时候,速度就比普通的表要慢一些。
优点
记录排序,查询效率惊人(最大的优点)
提高缓冲区缓存效率,因为给定查询在缓存中需要的 block 更少。
减少缓冲区缓存访问,提高可扩展性(每个缓冲区缓存获取都需要缓冲区缓存的多个闩 shuan,而闩是串行化设备,会限制应用的扩展能力)。
获取数据的工作总量更少,因为获取数据更快。
每个查询完成的物理 I/O 更少。
节约磁盘空间的占用,主键没有空间开销,索引就是数据
缺点
插入效率也许低于堆文件;
对于经常更新的表不适合用 IOT,因为维护索引的开销较大,何况是多字段索引
适用情况
全索引表:完全由主键组成的表。这样的表如果采用堆组织表,则表本身完全是多余的开销,因为所有的数据全部同样也保存在索引里,此时,堆表是没用的。
代码查找表。如果你只会通过一个主键来访问一个表,这个表就非常适合实现为 IOT.
如果你想保证数据存储在某个位置上,或者希望数据以某种特定的顺序物理存储,IOT 就是一种合适的结构 。
高频度的一组关联数据查询:经常在一个主键或唯一键上使用 between 查询
使用索引降低效率举例:
select count(*) from T,T上有索引,优化器仍然全表扫描
对一个有索引的列作出函数查询select * from where f(col)=value
三、(代码题。本题满分20分。)
某商场部分关系模式如下:
店铺表store(store_id, store_name, store_floor, room_no)
商品表commodity(com_id, com_name, com_price, store id)
销售员表saler(saler_id, saler_name, saler_gender, saler_age, store_id)
流水账单表 bill(bill_id, saler_id, com_id, purchase_quantity, total_price, bill_time)
其中,店铺表记录了该商场入驻的店铺信息,商品为每个店铺中销售的商品信息,销售员为店铺中的工作人员,流水账单表为为商场收银台交易的纪录, bill_time交易发生的时间,为 datetime类型,每个流水账单只包含了一种商品,不同类商品为不同的账单,purchase_quantity数量为正整数。
(1)在生成账单记录时, total_price是由传入的 com_id和 purchase_quantity查询到相关的单价以及数量计算出来的,请完成这样一条插入。
insert into bill(bill_id, saler_id, com_id, purchase_quantity, total_price, bill_time) values(:bill_id, :saler_id, :com_id, :purchase_quantity, :purchase_quantity*(select com_price from commodity where com_id=:com_id), :bill_time)
(2)A店铺的老板想要了解一下店铺员工每天的销售业绩,请查询 store_id为"MCSA"的店铺里的所有员工在2015年11月11日的完成的交易笔数,以及每个员工完成的总交易额。
select s.saler_id, s.saler_name, count(bill_id) as bill_count, sum(total_price) as bill_total from saler s, bill b
where s.store_id='MCSA' and s.saler_id=b.saler_id and date_format(bill_time, '%Y-%m-%d')='2015-11-11'
union
select saler_id, saler_name, 0 as bill_count, 0 as bill_total from saler
where store_id='MCSA' and saler_id not in(
select saler_id from bill where date_format(bill_time, '%Y-%m-%d')='2015-11-11')
商场的管理人员想了解2015年11月11日哪个店铺的交易额最大,查询其店铺名称,店铺所在楼层,店铺编号以及当天的交易额。
select store_id, store_name, store_floor, room_no, sumPrice from
(select t.store_id, store_name, t.store_floor, t.room_no, sum(total_price) as sumPrice
from store t, saler s, bill b
where t.store_id=s.store_id
and s.saler_id=b.saler_id
and date_format(bill_time, '%Y-%m-%d')='2015-11-11'
group by t.store_id) as T
order by sumPrice
limit 0,1
四、(代码题。本题满分20分。)
教师表teacher(teacher_id, teacher_name, teacher_email, teacher_gender, teacher_title)
课程表course(course_id, course_name, teacher_id, term, year)
学生表student(student id, student_name, student_grade, student_gender)
选课情况course_election(ce id, course_id, student_ id, marks)
其中,教师表中 teacher title为教师的职称,课程表中term为学期,year为年份,如2015年第一学期,则term为1,year为2015,学生表中 student-grade为所在年级
(1)辅导员想了解其所在年级学生的课程选修数量是否合理,请查询该院系每个三年级学生2015年第一学期的选修课程数量,查询学生的 student id, student name,student_grade,以及选修的课程数量。
select s.student_id, s.student_name, s.student_grade, count(c.ce_id) as sumC
from student s, course c, course_election e
where s.student_grade=3 and c.year=2015 and c.term=1
and s.student_id=e.student_id and c.course_id=e.course_id
group by s.student_id
union
select student_id, student_name, student_grade, 0 as sumC
from student
where student_grade=3 and student_id not in(
select s.student_id from student, course c, course_election e
where s.student_grade=3 and c.year=2015 and c.term=1
and s.student_id=e.student_id and c.course_id=e.course_id
group by s.student_id
)
select s.student_id, s.student_name, s.student_grade, count(c.ce_id) as sumC
from student s
left join course c on c.course_id=e.course_id
left join course_election e on s.student_id=e.student_id
where s.student_grade=3 and c.year=2015 and c.term=1
group by s.student_id
(2)为了方便查询,希望创建一个课程视图,包括2015年第一学期的所有课程,包含课程表的所有字段,以及每门课的总选修人数。若没人选修,则选修人数为0。
create view course_view as
select c.course_id, c.course_name, c.teacher_id, c.term, c.year, ifnull(count(ce_id), 0) as sumP
from course c
left join course_elecetion e on c.course_id=e.course_id
where c.year=2015 and c.term=1
group by c.course_id
ifnull(a,b), ifnull里有两个数,如果第一个不是null,是a非null,就都等于a, 如果a=Null,就都为a。
(3)教务处现在进行了一些修改,当有不及格的成绩录入时,需要对成绩进行规范处理。对于低于60分的成绩按照60分算,使用触发器完成相应的要求。
create trigger pass_trigger
before update on course_election
for each row
begin
if new.marks<60
then
set new.marks=60
end if;
end
六、(代码题。本题满分20分。)
假设: Circo是一款面向于大学生的群组类的社交应用,致力于让同学们能够体验到校园生活更加有趣有活力的一面,营造和谐自然的校园氛围。在这里,你可以关注与自己志同道合的小伙伴(User),发布实时动态( Moment),创建或者加入各种各样有趣的兴趣圈子( Group),在圈子内Po上自己的美丽心情(red),参与各种话题( Topic)的讨论
其中涉及到一些实体数据表和属性,包括
用户User 编号_id,昵称 nickname,,头像 avatar,学校编号 schooled,创建时间 createdAt
学校 School 编号_id,学校名name
新鲜事 Moment 编号_id,发布者编号 author,文字内容 content,图片 Image,创建时间createdAt
新鲜事的点赞LikingMoment 用户编号 userid,新鲜事编号 momentId,创建时间 createdAt
话题 Topic 编号id,话题名称name,热度heat,创建时间 createdAt,更新时间 updated
话题关系表TopicRelation 话题编号 topica, moment编号 momentId
其中,话题热度根据时间推移按比例持续衰减,每24小时衰减10%,不足24小时则不进行衰减。(提示: power(xy),返回x的y次方)
1)选出当前热度前十的话题,包括话题的编号、名称、热度、参与的 moments数量,创建时间
select t._id, t.name,
power(0.9, TIMESTAMPDIFF(SECOND, now(), t.createAt)/(24*3600)) as current_heart,
count(tr.moment_id), t.createdAt from Topic t
join TopicRelation tr on t._id=tr.topicId
group bt t._id
order by current_heart limit 0,10
TIMESTAMPDIFF(单位,开始时间,结束时间)
2)话题「陈振宇老师可能是软院最瘦的老师』的id为546,选出该话题下最新的20条moments的详细信息,包括 moment的编号、创建时间、图片、文字内容、我是否点赞(0代表未点赞,1代表已点赞),用户的
编号、昵称、头像,用户所属学校的编号、名称
select m._id, m.createdAt, m.image, m.content, if(count(lm.momentId), 1) as isLiked, u._id, u.nickname, u.avatar, s._id, s.name from(
selecr * from Moment m
join TopicRelation tr on m._id=tr.momentId
where tr.topic=546
order by m.createdAt desc limit 0,20) t
join LikingMoment lm on t.momentId=lm.momentId
join User u on t.authorId=u._id
join School s on u.schoolId=s._id
where lm.userId=9527
3)为了提高数据库效率,从不同角度简述有哪些优化措施
a)读写分离,垂直拆分,水平拆分
b)建立索引,数据分区
c)合理配置数据库
d)优化sql语句,避免全表扫描
e)使用表变量代替临时表
临时表是利用了硬盘(tempdb数据库) ,表名变量是占用内存,因此小数据量当然是内存中的表变量更快。当大数据量时,就不能用表变量了,太耗内存了。大数据量时适合用临时表。
表变量缺省放在内存,速度快,所以在触发器,存储过程里如果数据量不大,应该用表变量。
DBEX-1-6-2015数据库开发技术相关推荐
- 演进式数据库开发技术的障碍
如果不讨论采用本书中描述的技术时会遇到的常见障碍,我们的讨论就有疏忽.第一个障碍是文化,这也是最难克服的障碍.今天的许多数据专家都是从20 世纪70年代和80年代早期开始他们的职业生涯的,那时候&qu ...
- 数据库开发技术java方向_Java开发工程师(Web方向) - 03.数据库开发 - 第5章.MyBatis...
第5章--MyBatis MyBatis入门 Abstract: 数据库框架的工作原理和使用方法(以MyBatis为例) 面向对象的世界与关系型数据库的鸿沟: 面向对象世界中的数据是对象: 关系型数据 ...
- 数据库开发技术复习题填空题
二.填空题 1.数据库是系统提供的最重要的数据库,其中存放了系统级的信息.(系统) 2.修改数据库使用T-SQL的 语句,删除数据库使用T-SQL的 语句. (ALTER ...
- oracle数据库开发技术
修改表名?.?????????? 创建用户,授予权限 用户名加c## -- 使用超级管理员登录 conn sys/root as sysdba; **可以不用超级管理员,system也可以,尽量** ...
- 数据库开发技术 课堂笔记2
本文主要来源是课堂笔记 有两种情况是比较头疼的: 数据库重构 数据库迁移(不同的数据库差异巨大) 空 == 空 这个判断的返回值,每个数据库的设计都不一样 返回值 数据库类型 false MySQL ...
- 数据库开发技术 大数据产业和产品链条
本文源自南京大学软件学院著名的刘嘉老师上课内容. 前言 首先说一说鹿晗的事情. 背景 马云知道11.11,而新浪不知道鹿晗何时表白. 担心中国明星有攀比心理. 有大量的写操作,不害怕读操作. Part ...
- QT跨平台桌面软件开发技术汇总
QT国产化和跨平台一直推进,从去年到今年已经经历了3个QT小项目,本人也从visual studio IDE 切换到 Visual Studio + QT IDE的跨平台大军之中,独立承担项 ...
- 基于JAVAWeb前端开发技术儿童教育网站计算机毕业设计源码+数据库+lw文档+系统+部署
基于JAVAWeb前端开发技术儿童教育网站计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAWeb前端开发技术儿童教育网站计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: ...
- 数据库应用开发技术实验报告
"数据库应用开发技术"实验报告 2020-2021学年 第二学期 实验名称: 学生姓名: 学 号: 专业班级: 所在学院: 指导教师: 职 称: 完成日期: 实验1 sql ser ...
最新文章
- Nutanix CE on Lenovo W520 初探
- php从数据库读取中文显示问号??的解决办法
- javascript元素跟随鼠标在指定区域运动
- 【视频】React ReduxToolkit状态管理:创建store对象及redux调试工具的安装方法
- mmdnn cannot import caffe
- 山洪沟防洪治理工程技术规范_幸福沟水库一期工程完工丨尚志城市供水、防洪、农业灌溉皆升级...
- mvc ajax图片上传,MVC 通过ajaxSubmit上传图片并显示
- Retrofit 使用flatmap操作符时处理错误、异常
- windows2003事件记录中显示组策略错误,登录域控制器很慢(服务器自身)
- Java通过银行卡号获取卡属银行(含校验)
- 我是如何入门机器学习的呢
- 最新版最简单SPSS 26安装详细教程
- B站李永乐讲解傅里叶变换--笔记
- txt电子书如何用安卓手机完美打开?
- 记录:使用DJANGO从0开始搭建微信公众平台(0)
- jquery mobile外部js无法载入问题
- TPC-C和TPC-H
- PaddlePaddle飞桨 CV训练营心得
- 计算机乘法算法流程,布斯乘法算法
- 留下来慢慢感悟(关于session和cookie)