一、(简答题,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数据库开发技术相关推荐

  1. 演进式数据库开发技术的障碍

    如果不讨论采用本书中描述的技术时会遇到的常见障碍,我们的讨论就有疏忽.第一个障碍是文化,这也是最难克服的障碍.今天的许多数据专家都是从20 世纪70年代和80年代早期开始他们的职业生涯的,那时候&qu ...

  2. 数据库开发技术java方向_Java开发工程师(Web方向) - 03.数据库开发 - 第5章.MyBatis...

    第5章--MyBatis MyBatis入门 Abstract: 数据库框架的工作原理和使用方法(以MyBatis为例) 面向对象的世界与关系型数据库的鸿沟: 面向对象世界中的数据是对象: 关系型数据 ...

  3. 数据库开发技术复习题填空题

    二.填空题 1.数据库是系统提供的最重要的数据库,其中存放了系统级的信息.(系统) 2.修改数据库使用T-SQL的         语句,删除数据库使用T-SQL的        语句. (ALTER ...

  4. oracle数据库开发技术

    修改表名?.?????????? 创建用户,授予权限 用户名加c## -- 使用超级管理员登录 conn sys/root as sysdba; **可以不用超级管理员,system也可以,尽量** ...

  5. 数据库开发技术 课堂笔记2

    本文主要来源是课堂笔记 有两种情况是比较头疼的: 数据库重构 数据库迁移(不同的数据库差异巨大) 空 == 空 这个判断的返回值,每个数据库的设计都不一样 返回值 数据库类型 false MySQL ...

  6. 数据库开发技术 大数据产业和产品链条

    本文源自南京大学软件学院著名的刘嘉老师上课内容. 前言 首先说一说鹿晗的事情. 背景 马云知道11.11,而新浪不知道鹿晗何时表白. 担心中国明星有攀比心理. 有大量的写操作,不害怕读操作. Part ...

  7. QT跨平台桌面软件开发技术汇总

    QT国产化和跨平台一直推进,从去年到今年已经经历了3个QT小项目,本人也从visual studio IDE   切换到 Visual Studio  +  QT  IDE的跨平台大军之中,独立承担项 ...

  8. 基于JAVAWeb前端开发技术儿童教育网站计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVAWeb前端开发技术儿童教育网站计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAWeb前端开发技术儿童教育网站计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: ...

  9. 数据库应用开发技术实验报告

    "数据库应用开发技术"实验报告 2020-2021学年 第二学期 实验名称: 学生姓名: 学 号: 专业班级: 所在学院: 指导教师: 职 称: 完成日期: 实验1 sql ser ...

最新文章

  1. Nutanix CE on Lenovo W520 初探
  2. php从数据库读取中文显示问号??的解决办法
  3. javascript元素跟随鼠标在指定区域运动
  4. 【视频】React ReduxToolkit状态管理:创建store对象及redux调试工具的安装方法
  5. mmdnn cannot import caffe
  6. 山洪沟防洪治理工程技术规范_幸福沟水库一期工程完工丨尚志城市供水、防洪、农业灌溉皆升级...
  7. mvc ajax图片上传,MVC 通过ajaxSubmit上传图片并显示
  8. Retrofit 使用flatmap操作符时处理错误、异常
  9. windows2003事件记录中显示组策略错误,登录域控制器很慢(服务器自身)
  10. Java通过银行卡号获取卡属银行(含校验)
  11. 我是如何入门机器学习的呢
  12. 最新版最简单SPSS 26安装详细教程
  13. B站李永乐讲解傅里叶变换--笔记
  14. txt电子书如何用安卓手机完美打开?
  15. 记录:使用DJANGO从0开始搭建微信公众平台(0)
  16. jquery mobile外部js无法载入问题
  17. TPC-C和TPC-H
  18. PaddlePaddle飞桨 CV训练营心得
  19. 计算机乘法算法流程,布斯乘法算法
  20. 留下来慢慢感悟(关于session和cookie)

热门文章

  1. 一键安装mysql5.7
  2. **opencv331install_path**
  3. 南方的X-Men看过来〜Cocos2d-x开发者沙龙(广州站)即将举办!
  4. ora-01031解决方法
  5. APL开发日志--2012-12-03
  6. 浅谈对IT架构师的理解
  7. 简单粗暴理解支持向量机(SVM)及其MATLAB实例
  8. 生成drl文件_drools原生drl规则文件的使用
  9. python实现Apriori算法
  10. 十分钟教会女朋友上手阿里云服务器