一、单选(每题2分)
1. 下列说法正确的是 ( C )
A. 复合索引中选择率低的应该放在第一位
B. 如果能够确保数据都在数据缓存中,大数据量全表扫描是可以接受的
C. 在查询条件的字段有索引情况下,也可能全表扫描。
D. 索引愈多查询性能愈好
2.关于RAID,下面说法正确的是 ( B)
A. RAID 1为硬盘条带,可以提高读写性能
B. 5块73G的硬盘组成RAID 5,可使用的空间为292G
C. RAID 0+1中一块硬盘损坏后,IO性能影响不大
D. RAID 0中一块硬盘损坏后,数据不丢失
3.有如下两个表EMP 和DEPT,表结构和数据如下:
EMP:
EMP_ID EMP_NAME
---- ----
1101 SMITH
1102 ELLE
1105 BLACK
1103 SCOTT
DEPT:
DEPT_ID DEPT_NAME
-------------------
1101 市场
1102 研发
1103 行政
1104 销售
现在执行下列SQL语句
SELECT A. EMP_NAME ,B.EDPT_NAME
FROM EMP A RIGHT JOIN DEPT B
ON A.DEPT_ID = B.DEPT_ID;
请问哪个输出结果是正确的(A )
A.
EMP_NAME EDPT_NAME
---------- ----------
SMITH 市场
ELLE 研发
SCOTT 行政
销售
B.
EMP_NAME EDPT_NAME
---------- ----------
SMITH 市场
ELLE 研发
SCOTT 行政
BLACK
C.
EMP_NAME EDPT_NAME
---------- ----------
SMITH 市场
ELLE 研发
BLACK 研发
SCOTT 行政
D.
EMP_NAME EDPT_NAME
---------- ----------
SMITH 市场
ELLE 研发
BLACK 研发
SCOTT 行政
销售
4. 何时使用“FULL OUTJOIN” ( C )
A.两个表都存在NULL值
B.想要返回两个集合的交集
C.想要返回两个集合的并集
D.想要返回两个集合的补集
E.想要返回两个集合的迪卡尔集
5. 在SQL语言中,一个基本表被删除,则与此基本表相关的下列内容中哪些也会被自动删除或失效?( D )
1)在此表中的数据 2)在此表上建立的索引 3)在此表上建立的视图
A. 1)和2)
B. 2)和3)
C. 1)和3)
D. 全部
6. 分析下面逻辑块
if v_price > 1000 then
v_new_prcie := v_price/2;
elsif v_price > 2000 then
v_new_prcie := v_price/4;
elsif v_price > 4000 then
v_new_prcie := v_price/5;
elsif v_price > 5000 then
v_new_prcie := v_price/8;
else
v_new_prcie := v_price/10;
end if;
如果v_prcie=8000 那么v_new_prcie 应该等于多少?( E )
A. 800
B. 1000
C. 1600
D. 2000
E. 4000
7. 关于事物粒度下列说法错误的是(A )
A.程序中要尽可能多的使用commit,事物粒度越小越好;
B. 频繁COMMIT可能会造成程序性能降低,因为造成了log file sync事件的大量时间花费;
C. 频繁commit会造成UNDO覆盖,容易产生ORA-01555;
D. 事物粒度过大会造成所等待时间延长及undo表空间不足
8. 当表的重复行数据很多时,应该创建的索引类型应该是( C )
A.B树
B.reverse
C.bitmap
D.函数索引
9. 在启动Oracle数据库实例的时候,下面操作的顺序如何排列?( C )
1)分配SGA
2)读取控制文件
3)读取redo文件
4)启动实例恢复
5)启动后台进程
6)检查数据文件的一致性
7)读取初始化参数文件
A.1,2,3,7,5,6,4
B.1,2,4,5,3,6,7
C.7,1,5,2,3,6,4
D.7,1,4,5,2,3,6
E.7,2,3,6,4,5,1
F.2,7,1,3,6,5,4
10. (单选)关于表和索引的描述,错误的是 ( C )
A. 表中插入新记录时,也会在索引中增加相应的记录。
B. drop表后,该表的所有索引也会被drop。
C. 索引不需要占用存储空间。
D. 删除表中的记录时,也会删除索引中相应的记录。
二、多选(每题3分,每题少选得1分,多选或错选均为0分)
1.下面哪语句属于DML语句(ACD );哪些属于DDL(BE )语句。
A. INSERT
B. CREATE
C. UPDATE
D. SELECT
E. TRUNCATE
F. COMMIT
2.(多选)CAP理论,该理论包含以下 (ABC )
A、Consistency 一致性
B、Availability 可用性
C、Tolerance ofnetwork Partition 分区容忍性
D、Performance 高性能
3. 以下那些聚集函数是有效的 (CDE )
SQL> desc t_userinfo
Name Type Nullable
-------- ------------ --------
USERID NUMBER(5)
USERNAME VARCHAR2(20) Y
IDCARD VARCHAR2(40) Y
BIRTHDAY DATE
A. sum(birthday)
B. avg(birthday)
C. count(birthday)
D. maximum(birthday)
E. min(birthday)
4. 下面哪些选项描述是正确的:( ACD)
A. order by缺省排序查询显示结果是升序排列的。
B. 在order by 子句中不能用字段的别名。
C. 在group by 子句中不能用字段的别名。
D. null值在升序排列中是被排列在所有非空值之后的。
E. 如果没有order by子句,查询结果将按照select列的第一个字段降序排列。
5. 优化OLTP SQL的措施一般有:(ABC )
A. 避免全表扫描
B. 合理建立索引
C. 选择恰当的连接方式
D. 增加表关联的个数
6. 对查询结果进行排序会一定程度地降低系统的性能,下列哪些操作用在SQL语句中会启动SQL引擎执行消耗系统资源的排序?( ABCDF)
供选择的答案:
A. DISTINCT
B. MINUS
C. INTERSECT
D. UNION
E. UNION ALL
F. ORDER BY
7. 在我们的日常工作中,合理的建立索引还不够,还需要在我们编写SQL语句是注意如何让我们编写的正确的使用索引,下列哪些选项能让我们正确使用上索引?( ABD)
A. 增加查询的范围,限制全范围的搜索。
B. 在索引列上进行运算操作,应把运算操作右移。
C. 利用hint 强制指定索引。
D. 避免不必要的类型转换,要了解“隐藏”的类型转换。
8. 关于AWR说法正确的是( ACD)
A.通过@ORACLE_HOME/rdbms/admin/addmrpt.sql脚本收集日志;
B. 取样时间段尽可能长;
C. 一般通过DB TIME 和Elapsed time 来衡量数据库负载;
D. AWR信息是有MMON 进程生成
9. 数据库中清除表中的数据并保留表student结构的SQL是( DE )
A. DROP TABLE student;
B. DROP TABLE student purge;
C. TRUNCATE TABLE student KEEP STRUCTURE;
D. TRUNCATE TABLE student REUSE STORAGE;
E. DELETE* FROM student ;
10. 以下关于设计说法正确的是:(ABCDEF )
A. 任何表的设计都要考虑到数据的删除策略,表中的数据不能无止境的增长而不删除
B. 严禁将业务数据放在系统表空间(system)中,必须有独立的表空间存放业务数据
C. 在不同业务系统共用同一个数据库时,要注意不同业务系统的对象必须存放在不同的用户下面,绝不能混放在同一用户下
D. 严禁使用sys/system用户存放任何业务数据
E. 不可以对表或索引指定并行度,如果使用Oracle并行处理方式(并行查询、并行DML),只能在具体语句中指定并行度
F. 表的设计必须满足第三范式(3NF),避免出现数据不一致。
三、问答题
1. 修改如下有错误的PL/SQL程序块(10分)
declare
vn_serv_id number(11);
vn_loop number(6);
cursor get_serv_id is select serv_id from serv;
begin
vn_loop = 0;
openget_serv_id;
loop
fetch get_serv_id into :vn_serv_id;
exit when get_serv_id%notfound;
vn_loop++;
ifvn_loop >= 1000
dbms_output.put[pgw1] (vn_loop);
end if;
end loop[pgw2] ;
end ;
2. 简述ORACLE数据库响应用户修改数据操作的基本流程(20)
1,用户提交一个update语句
2,SERVER PROCESS检查内存缓存
i 如果没有有效内存空间,启动DBWR,将缓存中未写入磁盘的脏数据块写入
ii 如果有有效空间,从磁盘读入数据
3,在缓存内更新数据
i 申请一个回滚段入口,将旧数据写入回滚段
ii 加锁更新数据
iii 并同时将修改记录在Redo log buffer 中
4,用户提交一个Commit
i SCN增加
ii 将Redo log buffer 写入Redo log file
iii 告诉用户 Commit完成
1,相应事务分配回滚段(undo segment).
2,分配回滚段后,在回滚段头上创建事务表slot(transaction table slot).
3.创建事务表后会生出TXID(TransactionID),再将TXID分配给当前事务。这个值指向分给事务的回滚段头上存在的事务表的准确位置。
4.事务对象的数据块载入到高速缓冲区,在块头的ITL(Intersted transaction list)上登记事务条目。
如果itl上没有所需空间,就会发生等待enq:TX-allocate ITL entry。
5.将需要修改的块的修改信息存储到PGA,存储的方式是changevector,之后进程将PGA中的change vector以redo record复制到重做缓冲区。
6.将之前映像信息记录到撤销块,继而修改数据块,被修改的数据块变为脏状态。而且在高速缓冲区中创建以修改的数据块的CR块。
7.执行commit后给事务分配SCN,提交信息存储在重做缓冲区。
8.回滚段头的事务表中存储已成功提交的信息,结束包括TX锁在内的所有资源占有。
9.重做缓冲区的内容记录在重做日志文件上。
3.完成以下操作(20)
建表:
create table table_a(
studid varchar2(10),--学号
studname varchar2(40),--姓名
depart varchar2(50),--系别
studscore varchar2(10) --学分
);
insert into
table_a(studid,studname,depart,studscore)
values ('08001','李明','计算机',80);
insert into
table_a(studid,studname,depart,studscore)
values ('08002','张三', '信息技术',95);
insert into
table_a(studid,studname,depart,studscore)
values ('08005','王五', '信息技术',96);
create table table_b (
studid varchar2(10), --学号
studname varchar2(40), --姓名
depart varchar2(50), --系别
studscore varchar2(10) --学分
);
insert into
table_b(studid,studname,depart,studscore)
values ('08001','李明','计算机',80);
insert into
table_b(studid,studname,depart,studscore)
values ('08002','张三', '信息技术',100);
insert into
table_a(studid,studname,depart,studscore)
values ('08003','李四','数学系',65);
insert into
table_a(studid,studname,depart,studscore)
values ('08004','张飞','英语系',77);
问题1:请将table_a 的studid字段建成唯一索引,写出sql语句。
Create unique index studid_index on table_a(studid);
问题2:请用table_b中姓名为张飞的学分更新table_a中姓名为李明的学分,写出sql语句。
Update table_a set studscore = (selectstudscore from table_a where studname = ‘张飞’) where studname = ‘李明’
问题3:请把table_a中的数据全部更新到table_b中,以学号,姓名及院系为KEY值,有则更新学分,无则插入,写出sql语句。
declare l_cnt number(10);
begin
for rs in (selectstudid,studname,depart,studscore from table_a)
loop
select count(1) into l_cnt from table_b b where b.studid=rs.studid andb.studname=rs.studname and b.depart=rs.depart
ifl_cnt>=1
update table_b b set studscore=rs.studscore where b.studid=rs.studid andb.studname=rs.studname and b.depart=rs.depart
else
insert into table_b values(rs.studid,rs.studname,rs.depart,rs.studscore)
end loop;
end;
merge into table_b b using table_a a
on ( a.studid=b.studud and a.studname=b.studname and a.depart = b.depart)
when matched then update set b.studscore =a.studscore
when not matched then insert values(a.studid,a.studname,a.depart,a.studscore)
问题4:请用命令对table_b扩展一个字段 studsex varchar2(4),写出sql语句。
Alter table table_b add studsex varchar2(4)not null;
问题 5:建立一个视图v_table,要求是v_table 是table_a 和table_b的并集,当学号,姓名及院系一致时,而学分不一致时,以table_a学分为准。
Create view v_table as select Nvl(a.studid,b.studid) , Nvl(a.studname,b. studname), Nvl(a.depart,b. depart), Nvl(a.studscore,b. studscore)
From table_a a full join table_b b on a. studid =b. studid and a. studname = b. studname and a.depart = b.depart
问题 6:根据studid找出table_b中不存在table_a 的数据。
Select *
From table_b B where not exists (select 1from table_a A where A.studid=B.studid )