一、论述题(10分)
1)简述DBMS对SQL解析执行的步骤(2)
1语法分析:分析语句的语法是否符合规范,衡量语句中各表达式的意义
2语义分析:检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限
3视图转换:将涉及视图的查询语句转换为相应的对基表查询语句。
4表达式转换:将复杂的SQL表达式转换为较简单的等效连接表达式
5选择优化器:不同的优化器一般产生不同的“执行计划”
6选择连接方式 Oracle有三种连接方式、对多表连接Oracle可选择适当的连接方式
7选择连接顺序:对多表连接Oracle选择哪对表先连接,选择这两表中哪个表做为源数据表
8选择数据的搜索路径:根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。
9运行“执行计划”
运行执行计划,返回执行结果。运行执行计划的代价根据sql语句的不同可大可小。
1:语法分析
2:权限与对象检查
3: 在共享池中检查是否有完全相同的之前完全解析好的. 如果存在,直接跳过4和5,运行Sql, 此时算soft parse.
4:选择执行计划
5:产生执行计划
2)解释硬解析和软解析的含义和区别(3)
解析:分为硬解析和软解析。
若在共享池中没有找到已有的执行计划,则进行硬解析,否则为软解析。
硬解析指使用优化器对sql语句进行优化,将sql转化为一些等价语句,并选择代价最小的语句生成执行计划;
软解析指在共享池中已经存在对应的执行计划,则不再进行优化,直接使用该执行计划。硬解析的代价最大,软解析较小
3)将类似的SQL由硬解析变成软解析的技术称为什么?(1)
Shared Pool
4)对上述技术举例说明(4)
1:语法分析
2:权限与对象检查
3: 在共享池中检查是否有完全相同的之前完全解析好的. 如果存在,直接跳过4和5,运行Sql, 此时算soft parse.
4:选择执行计划
5:产生执行计划
范式的优点:
a.写入快,因为不需要写冗余数据,所以减少了写的负担。
b.更新快,因为通常只需要更新更少的数据。
c.由于没有冗余,所以不会造成数据不一致。
d.更少的需要GROUP BY和DISTINCT。
缺点是:需要关联。
范式的缺点,就是反范式的优点,不需要关联,并且因为在同一个表中,可以设计合适的索引。
实际应用中通常不会采用完成的范式,而是放置一些冗余,以减少表与表的关联,加快查询速度。
二、(简答题,10分)
1)什么是逆范式(2)
逆范式化指的是通过增加冗余或重复的数据来提高数据库的读性能。
反范式是针对第三范式来说的,通过添加冗余的方式破坏了第三范式
2)你认为判断何时该使用逆范式的条件有哪些(4)
首先应当满足2NF
比较注重读性能,减少连表操作
写入更新比较少
不介意冗余
不需要group by和distinct
应当避免关联
3)对于2)针对每一种条件下的情况,请简单举一些例子说明
goods 商品表
goods_id,goods_name,cate_id(分类id)
category 分类表
cate_id ,cate_name
分类表: cate_id ,cate_name,goods_count
三、(简答题,满分10分,附加分为5分)
DBMS中索引有很多种,请简述下列问题:
1)位图索引(bitmap index)的存储结构和用途(3)
主要针对大量相同值的列而创建(例如:类别,操作员,部门 ID,库房 ID 等),
这种方式存储数据,相对于 B*Tree 索引,占用的空间非常小,创建和使用非常快.
位图索引:
非常紧凑,块变得复杂,更新操作会导致整个块被锁住,不利于更新,所以创建位图索引的目的是为了查询而不是为了更新
2)函数索引(function-based index)的含义和用途(3)
基于对表中列进行计算后的结果创建索引。原本对 X 构建索引,此时对 F(X)构建索引。
在不修改应用程序逻辑的基础上提高查询效率
函数索引与通常 B*树索引的结构,存在很大相似性。区别就在于形成树结构的叶子节点上,保存的不是索引列的取值,而是经过特定的函数处理过的索引列值
但是函数索引的综合消耗大于普通的 B 树索引
适用范围有限,必须函数的使用和定义完全一样
函数索引的针对性很强,如果这个需求不属于关键需求,性价比略差
对插入数据有一定影响,因为需要通过函数计算一下,然后生成索引。但是插入数据一般都是少量插入,而查询数据一般数据量比较大。
函数索引还有一个功能,只对部分行建立索引。
3)反向键索引或叫逆向索引(reverse index)的含义和用途(3)
也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。
“ 倒排索引”是实现单词到文档映射关系的最佳实现方式和最有效的索引结构.
反向索引英文名叫做 Inverted index,顾名思义,是通常意义下索引的倒置。
举个例子: 我们用不同的数字索引不同的句子(比如以下三句在文本中是按照0,1,2的顺序排列的)
0 : "I love you"
1 : "I love you too "
2 : "I dislike you"
如果要用单词作为索引,而句子的位置作为被索引的元素,那么索引就发生了倒置:
"I" : {0,1,2}
"love" : {0, 1}
"you" : {0,1,2}
"dislike" : {2}
如果要检索 "I dislike you" 这句话,那么就可以这么计算 : {0,1,2} ^ {2} ^ {0,1,2} (这里"^"代表交集)
4)你还知道什么索引类型,并简单描述(1分,每回答一种并简单描述得1分,最多可以额外附加5分)
唯一索引
主键索引
组合索引
物理原理上的
Hash索引
B+树索引
聚簇索引:为了提高某个属性(或属性组)的查询速度,把这个或这些属性上具有相同值的元组集中存放在连续的物理块中称为聚簇
所谓 Hash 索引,实际上就是通过一定的 Hash 算法,将需要索引的键值进行 Hash 运算,然后将得到的 Hash 值存入一个 Hash 表中。每次需要检索的时候,都会将检索条件进行相同算法的 Hash 运算,再和 Hash 表中的 Hash 值进行比较,并得出相应的信息。HASH 索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。
HASH 的缺点
(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和 Hash 运算前完全一样。
(2)Hash 索引无法被用来避免数据的排序操作。由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且 Hash 值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;
(3)Hash 索引不能利用部分索引键查询。对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。
(4)Hash 索引在任何时候都不能避免表扫描。前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash 运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
(5)Hash 索引遇到大量 Hash 值相等的情况后性能并不一定就会比 B-Tree 索引高。对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。
五、(代码题。本题满分15分,附加题5分)
有一个船员租赁船只的系统,表结构如下:
Sailors(sid, sname, rating, age);
Boats(bid, bname, color);
Reaserves(sid, bid, day)
用完整的SQL语句,利用嵌套查询完成1) 2)两个查询,并从SQL优化的角度分析如何根据一些过滤条件的好坏来选择使用不同嵌套查询关键字
1)找出年龄在35岁以上,rating>5的,一个月内,没有预定红色船只水手的名字(7)
select s.sname from Sailors s where s.age>35 and not exists(
select * from Reaserves r, Boats b where s.sid=r.sid and r.bid=b.bid and b.color='red' and sysdate-r.day<=30)
2)找出年龄在35岁以上,rating>5的,一个月内,同时预定了红色船和绿色船的水手姓名(8)
select sname from Sailors s, Boats b, Reaserves r
where s.sid=r.sid and b.bid=r.bid and sysdate-day<=30 and color='red' and rating>5
Intersect
select sname from Sailors s, Boats b, Reaserves r
where s.sid=r.sid and b.bid=r.bid and sysdate-day<=30 and color='green' and rating>5
3)找出预定了所有船的水手的名字(附加题5分)
select s.name from Sailors where s.sid in (
select distinct(r.sid) from Reaserves r group by r.sid
having count(distinct(r.bid))=(select count(*) from Boats))
七、(论述题。满分15分,附加题5分)
对于将层次数据(树状结构数据)存储到关系表中,详细回答以下问题:
1)针对简单树状结构,请描述三种存储设计方案(3)
Adjacency model-邻接模型
Materialized path model-物化路径模型
Nested set model-嵌套集合模型
2)针对1)设计一个简单的例子进行表述(2)
3)针对2)每一种存储方案,完成自顶向下检索的SQL语句(5)
select lpad(description, length(description) + level) description,
commander
from adjacency_model
connect by parent_id = prior id
start with commander = 'Général de Division Dominique Vandamme'
4)针对2)每一种存储方案,完成自底向上检索的SQL语句(5)
select lpad(description, length(description) + level) description,
commander
from adjacency_model
connect by id = prior parent_id
start with description like '%Highland%'
5)简单表述不同的存储设计方案的应用特性(附加题:5分)
7.2.1 邻接模型
1. 邻接模型:id,parent_id(指向上级)
自顶向下查询,假设兄弟节点无序,主要用于单父节点。Connect by 相当容易实现
2. 特性:
a) 插入、移动、删除节点快捷
b) 只支持单父节点,不支持多父节点
c) Connect by 容易实现
d) 递归实现,用 oracle 的 with,表示出树的层次
e) 删除子树较难
f) 三种模型中性能最高,每秒返回的查询记录数最多,遍历一次,不是基于关系的处理,性能最好
7.2.2 物化路径
1. 物化模型:PathID(1,1.1,1.2,1.1.1,1.2.1,…),使用层次式的路径明确地标识出来,一般用字符串存路径。每一个节点都存储在树中的位置信息,它允许节点之间有顺序(因为路径的标识有顺序),比如家族族谱
2. 特性:
a) 查询编写不困难,找出适当的记录并缩排显示算容易
b) 计算由路径导出的层次不方便。
c) 查询复杂度主要在路径字符串的处理
d) 树的的深度要自己写函数计算,可以计算“.”的数目或者去掉“.”后字符串的长度
e) 子节点有顺序,但不应该暗示任何兄弟节点的排序
f) 会产生重复记录的问题
g) 物化路径 path 不应该是 KEY,即使他们有唯一性
h) 所选择的编码方式不需要完全中立
i) 三种模型中性能中等
7.2.3 嵌套集合模型
1. 嵌套集合模型:每一个节点都有一个左编号,都有一个右编号,left_num,right_num,某节点后代的 left_num 和 right_num 都会在该节点的 left_num 和 right_num 范围内
2. 特性
a) 易理解,查找某一个节点的子节点很容易,但是对结果集排序不好操作,缩排无法处理
b) 适合深度优先遍历
c) 动态计算深度困难,不要显示人造根节点,为了缩排显示要硬编码最大深度,缩排处理会降低查询性能
d) 数据元素之间不再是点和线的关系,而是以容纳和被容纳的方式
e) 计算量大,对存储程序要求高。它是基于指针的解决方案。
f) 数据更新,删除,插入开销很大,较少使用
g) 三种模型中,查询的性能最低
自顶向下效率:嵌套集合<物化路径<邻间模型
最终来说:自底向上方式查询效率:邻接表模型>物化路径模型>嵌套模型。
来源:CSDN
作者:什么你竟然不会敲代码
链接:https://blog.csdn.net/m0_37302219/article/details/104770225