Oracle 数据库笔试面试试题及答案
一、基础概念
1.
列举几种表连接方式
Answer:等连接(内连接)、非等连接、自连接、外连接(左、右、全)
Or hash join/merge join/nest loop(cluster join)/index join ??
ORACLE 8i,9i 表连接方法。
一般的相等连接: select * from a, b where a.id = b.id; 这个就属于内连接。
对于外连接:
Oracle 中可以使用“(+) ”来表示,9i 可以使用 LEFT/RIGHT/FULL OUTER JOIN
LEFT OUTER JOIN:左外关联
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);
等价于
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id=d.department_id(+)
结果为:所有员工及对应部门的记录,包括没有对应部门编号 department_id 的员工记录。
RIGHT OUTER JOIN:右外关联
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
等价于
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+)=d.department_id
结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录。
FULL OUTER JOIN:全外关联
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id);
结果为:所有员工及对应部门的记录,包括没有对应部门编号 department_id 的员工记录和
没有任何员工的部门记录。
ORACLE8i 是不直接支持完全外连接的语法,也就是说不能在左右两个表上同时加上(+),下
面是在 ORACLE8i 可以参考的完全外连接语法
select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+)
union
select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id
连接类型
定义
图示
例子
内连接
只连接匹配的行
左外连接
右外连接
全外连接
(theta)连接
交叉连接
包含左边表的全部
行(不管右边的表
中是否存在与它们
匹配的行)以及右
边表中全部匹配的
行
包含右边表的全部
行(不管左边的表
中是否存在与它们
匹配的行)以及左
边表中全部匹配的
行
包含左、右两个表
的全部行,不管在
另一边的表中是否
存在与它们匹配的
行
使用等值以外的条
件来匹配左、右两
个表中的行
生成笛卡尔积——
它不使用任何匹配
或者选取条件,而
是直接将一个数据
源中的每个行与另
一个数据源的每个
行一一匹配
select A.c1,B.c2
from A join B on
A.c3 = B.c3;
select A.c1,B.c2
from A left join B
on A.c3 = B.c3;
select A.c1,B.c2
from A right join
B on A.c3 = B.c3;
select A.c1,B.c2
from A full join B
on A.c3 = B.c3;
select A.c1,B.c2
from A join B on
A.c3 != B.c3;
select A.c1,B.c2
from A,B;
2.
不借助第三方工具,怎样查看 sql 的执行计划
I) 使用 Explain Plan,查询 PLAN_TABLE;
EXPLAIN
PLAN
SET STATEMENT_ID='QUERY1'
FOR
SELECT *
FROM a
WHERE aa=1;
SELECT
operation, options, object_name, object_type, ID, parent_id
FROM plan_table
WHERE STATEMENT_ID = 'QUERY1'
ORDER BY ID;
II)SQLPLUS 中的 SET TRACE 即可看到 Execution Plan Statistics
SET AUTOTRACE ON;
3.
如何使用 CBO,CBO 与 RULE 的区别
IF 初始化参数 OPTIMIZER_MODE = CHOOSE THEN --(8I DEFAULT)
IF 做过表分析
THEN 优化器 Optimizer=CBO(COST);
/*高效*/
ELSE
优化器 Optimizer=RBO(RULE);
/*高效*/
END IF;
END IF;
区别:
RBO 根据规则选择最佳执行路径来运行查询。
CBO 根据表统计找到最低成本的访问数据的方法确定执行计划。
使用 CBO 需要注意:
I) 需要经常对表进行 ANALYZE 命令进行分析统计;
II) 需要稳定执行计划;
III)需要使用提示(Hint);
使用 RULE 需要注意:
I) 选择最有效率的表名顺序
II) 优化 SQL 的写法;
在 optimizer_mode=choose 时,如果表有统计信息(分区表外),优化器将选择 CBO,否
则选 RBO。
RBO 遵循简单的分级方法学,使用 15 种级别要点,当接收到查询,优化器将评估使用到
的要点数目,然后选择最佳级别(最少的数量)的执行路径来运行查询。
CBO 尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,
计算使用不同的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于
确定执行计划。
4.
如何定位重要(消耗资源多)的 SQL
使用 CPU 多的用户 session
SELECT a.SID, spid, status, SUBSTR (a.program, 1, 40) prog,
a.terminal,a.SQL_TEXT, osuser, VALUE / 60 / 100 VALUE
FROM v$session a, v$process b, v$sesstat c
WHERE c.statistic# = 12 AND c.SID = a.SID AND a.paddr = b.addr
ORDER BY VALUE DESC;
select sql_text from v$sql
where disk_reads > 1000 or (executions > 0 and buffer_gets/executions >
30000);
5.
如何跟踪某个 session 的 SQL
利用 TRACE 跟踪
ALTER SESSION SET SQLTRACE ON;
COLUMN SQL format a200;
SELECT
machine, sql_text SQL
FROM v$sqltext a, v$session b
WHERE address = sql_address
AND machine = '&A'
ORDER BY hash_value, piece;
exec dbms_system.set_sql_trace_in_session(sid,serial#,&sql_trace);
select sid,serial# from v$session where sid = (select sid from v$mystat where
rownum = 1);
exec
dbms_system.set_ev(&sid,&serial#,&event_10046,&level_12,'')
;
6.
SQL 调整最关注的是什么
检查系统的 I/O 问题
sar-d 能检查整个系统的 iostat(IO statistics)
查看该 SQL 的 response time(db block gets/consistent gets/physical
reads/sorts (disk))
7.
说说你对索引的认识(索引的结构、对 dml 影响、对查询影响、为什么提高
查询性能)
索引有 B-TREE、BIT、CLUSTER 等类型。ORACLE 使用了一个复杂的自平衡 B-tree
结构;通常来说,在表上建立恰当的索引,查询时会改进查询性能。但在进行插入、删
除、修改时,同时会进行索引的修改,在性能上有一定的影响。有索引且查询条件能使
用索引时,数据库会先度取索引,根据索引内容和查询条件,查询出 ROWID,再根据 ROWID
取出需要的数据。由于索引内容通常比全表内容要少很多,因此通过先读索引,能减少
I/O,提高查询性能。
b-tree index/bitmap index/function index/patitional index(local/global)
索引通常能提高 select/update/delete 的性能,会降低 insert 的速度,
8.
使用索引查询一定能提高查询的性能吗?为什么
通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.
索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,
索引本身也会被修改. 这意味着每条记录的 INSERT,DELETE,UPDATE 将为此多付出 4,5
次的磁盘 I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询
反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)
适用于两种情况:
基于一个范围的检索,一般查询返回结果集小于表中记录数的 30%宜采用;
基于非唯一性索引的检索
索引就是为了提高查询性能而存在的,如果在查询中索引没有提高性能,只能说是
用错了索引,或者讲是场合不同
9.
绑定变量是什么?绑定变量有什么优缺点?
绑定变量是指在 SQL 语句中使用变量,改变变量的值来改变 SQL 语句的执行结果。
优点:使用绑定变量,可以减少 SQL 语句的解析,能减少数据库引擎消耗在 SQL
语句解析上的资源。提高了编程效率和可靠性。减少访问数据库的次数, 就能实际上减
少 ORACLE 的工作量。
缺点:经常需要使用动态 SQL 的写法,由于参数的不同,可能 SQL 的执行效率不同;
绑定变量是相对文本变量来讲的,所谓文本变量是指在 SQL 直接书写查询条件,
这样的 SQL 在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条
件,查询 bind value 在运行时传递,然后绑定执行。
优点是减少硬解析,降低 CPU 的争用,节省 shared_pool
缺点是不能使用 histogram,sql 优化比较困难
10. 如何稳定(固定)执行计划
可以在 SQL 语句中指定执行计划。使用 HINTS;
query_rewrite_enabled = true
star_transformation_enabled = true
optimizer_features_enable = 9.2.0
创建并使用 stored outline
11. 和排序相关的内存在 8i 和 9i 分别怎样调整,临时表空间的作用是什么
SORT_AREA_SIZE 在进行排序操作时,如果排序的内容太多,内存里不能全部放下,
则需要进行外部排序,
此时需要利用临时表空间来存放排序的中间结果。
8i 中 sort_area_size/sort_area_retained_size 决定了排序所需要的内存, 如
果排序操作不能在 sort_area_size 中完成,就会用到 temp 表空间
9i 中如果 workarea_size_policy=auto 时,
排序在 pga 内进行,通常 pga_aggregate_target 的 1/20 可以用来进行 disk
sort;
如果 workarea_size_policy=manual 时,排序需要的内存由 sort_area_size 决定,
在执行 order by/group by/distinct/union/create index/index rebuild/minus 等操
作时,如果在 pga 或 sort_area_size 中不能完成,排序将在临时表空间进行(disk sort),
临时表空间主要作用就是完成系统中的 disk sort.
12. 存在表 T(a,b,c,d),要根据字段 c 排序后取第 21—30 条记录显示,请给出 sql
SELECT
*
FROM (SELECT ROWNUM AS row_num, tmp_tab.*
FROM (SELECT
a, b, c, d
FROM T
ORDER BY c) tmp_tab
WHERE ROWNUM <= 30)
WHERE row_num >= 20
ORDER BY row_num;
create table t(a number(,b number(,c number(,d number();
/
begin
for i in 1 .. 300 loop
insert into t values(mod(i,2),i/2,dbms_random.value(1,300),i/4);
end loop;
end;
/
select * from (select c.*,rownum as rn from (select * from t order by c desc)
c) where rn between 21 and 30;
/
select * from (select * from test order by c desc) x where rownum < 30
minus
select * from (select * from test order by c desc) y where rownum < 20
order by 3 desc
相比之 minus 性能较差
二:数据库基本概念类
1 Pctused and pctfree 表示什么含义有什么作用
pctused 与 pctfree 控制数据块是否出现在 freelist 中,
pctfree 控制数据块中
保留用于 update 的空间,当数据块中的 free space 小于 pctfree 设置的空间时,该数据
块从 freelist 中去掉,当块由于 dml 操作 free space 大于 pct_used 设置的空间时,该
数据库块将被添加在 freelist 链表中。
2 简单描述 tablespace / segment / extent / block 之间的关系
tablespace: 一个数据库划分为一个或多个逻辑单位,该逻辑单位成为表空间;每
一个表空间可能包含一个或多个 Segment;
Segments: Segment 指在 tablespace 中为特定逻辑存储结构分配的空间。每一个
段是由一个或多个 extent 组成。包括数据段、索引段、回滚段和临时段。
Extents: 一个 extent 由一系列连续的 Oracle blocks 组成.ORACLE 为通过
extent 来给 segment 分配空间。
Data Blocks:Oracle 数据库最小的 I/O 存储单位,一个 data block 对应一个或
多个分配给 data file 的操作系统块。
table 创建时,默认创建了一个 data segment,每个 data segment 含有 min extents
指定的 extents 数,每个 extent 据据表空间的存储参数分配一定数量的 blocks
3 描述 tablespace 和 datafile 之间的关系
一个表空间可包含一个或多个数据文件。表空间利用增加或扩展数据文件扩大表空
间,表空间的大小为组成该表空间的数据文件大小的和。一个 datafile 只能属于一个
表空间;
一个 tablespace 可以有一个或多个 datafile,每个 datafile 只能在一个
tablespace 内,
中,tablespace 是逻辑上的概念,datafile 则在物理上储存了数据库的种种对象。
table 中的数据,通过 hash 算法分布在 tablespace 中的各个 datafile
4 本地管理表空间和字典管理表空间的特点,ASSM 有什么特点
本地管理表空间:(9i 默认)空闲块列表存储在表空间的数据文件头。
特点:减少数据字典表的竞争,当分配和收缩空间时会产生回滚,不需要合并。
字典管理表空间:(8i 默认)空闲块列表存储在数据库中的字典表里.
特点:片由数据字典管理,可能造成字典表的争用。存储在表空间的每一个段都会
有不同的存储字句,需要合并相邻的块;
本地管理表空间(Locally Managed Tablespace 简称 LMT)
8i 以后出现的一种新的表空间的管理模式,通过位图来管理表空间的空间使用。
字典管理表空间(Dictionary-Managed Tablespace 简称 DMT)
8i 以前包括以后都还可以使用的一种表空间管理模式,通过数据字典管理表空间
的空间使用。动段空间管理(ASSM),它首次出现在 Oracle920 里有了 ASSM,链接列
表 freelist 被位图所取代,它是一个二进制的数组,
能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储
本质,ASSM 表空间上创建的段还有另外一个称呼叫 Bitmap Managed Segments(BMB 段)。
5 回滚段的作用是什么
回滚段用于保存数据修改前的映象,这些信息用于生成读一致性数据库信息、在数
据库恢复和 Rollback 时使用。一个事务只能使用一个回滚段。
事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在
回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE 将会利用回滚段中的数据前影像
来将修改的数据恢复到原来的值。
事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在 undo 表空间
中,ORACLE 将在下次打开数据库时利用回滚来恢复未提交的数据。
读一致性:当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修
改。 当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语
句级读一致性)
当 ORACLE 执行 SELECT 语句时,ORACLE 依照当前的系统改变号(SYSTEM CHANGE
NUMBER-SCN) 来保证任何前于当前 SCN 的未提交的改变不被该语句处理。可以想象:
当一个长时间的查询正在执行时, 若其他会话改变了该查询要查询的某个数据块,
ORACLE 将利用回滚段的数据前影像来构造一个读一致性视图
6 日志的作用是什么