整理⼀些dba的⾯试题[转]⼀:SQL tuning 类
1:列举⼏种表连接⽅式
hash join/merge join/nest loop(cluster join)/index join
2:不借助第三⽅⼯具,怎样查看sql的执⾏计划
set autot on
explain plan set statement_id = &item_id for &sql;
select * from table(dbms_xplan.display);
3:如何使⽤CBO,CBO与RULE的区别
在optimizer_mode=choose时,如果表有统计信息(分区表外),优化器将选择CBO,否则选RBO。RBO遵循简单的分级⽅法学,使⽤15种级别要点,当接收到查询,优化器将评估使⽤到的要点数⽬,然后选择最佳级别(最少的数量)的执⾏路径来运⾏查询。
CBO尝试到最低成本的访问数据的⽅法,为了最⼤的吞吐量或最快的初始响应时间,计算使⽤不同的执
⾏计划的成本,并选择成本最低的⼀个,关于表的数据内容的统计被⽤于确定执⾏计划。
4:如何定位重要(消耗资源多)的SQL
select sql_text
from v$sql
where disk_reads > 1000 or (executions > 0 and buffer_gets/executions > 30000);
5:如何跟踪某个session的SQL
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调整最关注的是什么
查看该SQL的response time(db block gets/consistent gets/physical reads/sorts (disk))
7:说说你对索引的认识(索引的结构、对dml影响、为什么提⾼查询性能)
b-tree index/bitmap index/function index/patitional index(local/global)
索引通常能提⾼select/update/delete的性能,会降低insert的速度,
8:使⽤索引查询⼀定能提⾼查询的性能吗?为什么
索引就是为了提⾼查询性能⽽存在的,
如果在查询中索引没有提⾼性能,
只能说是⽤错了索引,或者讲是场合不同
9:绑定变量是什么?绑定变量有什么优缺点?
绑定变量是相对⽂本变量来讲的,所谓⽂本变量是指在SQL直接书写查询条件,
这样的SQL在不同条件下需要反复解析,绑定变量是指使⽤变量来代替直接书写条件,
查询bind value在运⾏时传递,然后绑定执⾏。
优点是减少硬解析,降低CPU的争⽤,节省shared_pool
缺点是不能使⽤histogram,sql优化⽐较困难
10:如何稳定(固定)执⾏计划
query_rewrite_enabled = true
star_transformation_enabled = true
optimizer_features_enable = 9.2.0
创建并使⽤stored outline
这个贴⼦:
11:和排序相关的内存在8i和9i分别怎样调整,临时表空间的作⽤是什么
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
create table t(a number(8),b number(8),c number(8),d number(8));
/
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:简单描述table / segment / extent / block之间的关系
table创建时,默认创建了⼀个data segment,
每个data segment含有min extents指定的extents数,
每个extent据据表空间的存储参数分配⼀定数量的blocks
3:描述tablespace和datafile之间的关系
⼀个tablespace可以有⼀个或多个datafile,每个datafile只能在⼀个tablespace内,
table中的数据,通过hash算法分布在tablespace中的各个datafile中,
tablespace是逻辑上的概念,datafile则在物理上储存了数据库的种种对象。
4:本地管理表空间和字典管理表空间的特点,ASSM有什么特点
本地管理表空间(Locally Managed Tablespace简称LMT)
8i以后出现的⼀种新的表空间的管理模式,通过位图来管理表空间的空间使⽤。
字典管理表空间(Dictionary-Managed Tablespace简称DMT)
8i以前包括以后都还可以使⽤的⼀种表空间管理模式,通过数据字典管理表空间的空间使⽤。
动段空间管理(ASSM),
它⾸次出现在Oracle920⾥有了ASSM,链接列表freelist被位图所取代,它是⼀个⼆进制的数组,
能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,
ASSM表空间上创建的段还有另外⼀个称呼叫Bitmap Managed Segments(BMB 段)。
5:回滚段的作⽤是什么
事务回滚:当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,
当⽤户回滚事务(ROLLBACK)时,ORACLE将会利⽤回滚段中的数据前影像来将修改的数据恢复到原来的值。
事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在undo表空间中,
ORACLE将在下次打开数据库时利⽤回滚来恢复未提交的数据。
 读⼀致性:当⼀个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。
当⼀个语句正在执⾏时,该语句将看不到从该语句开始执⾏后的未提交的修改(语句级读⼀致性)
当ORACLE执⾏SELECT语句时,ORACLE依照当前的系统改变号(SYSTEM CHANGE NUMBER-SCN)
来保证任何前于当前SCN的未提交的改变不被该语句处理。可以想象:当⼀个长时间的查询正在执⾏时,
若其他会话改变了该查询要查询的某个数据块,ORACLE将利⽤回滚段的数据前影像来构造⼀个读⼀致性视图。
6:⽇志的作⽤是什么
记录数据库事务,最⼤限度地保证数据的⼀致性与安全性
重做⽇志⽂件:含对数据库所做的更改记录,这样万⼀出现故障可以启⽤数据恢复,⼀个数据库⾄少需要两个重做⽇志⽂件归档⽇志⽂件:是重做⽇志⽂件的脱机副本,这些副本可能对于从介质失败中进⾏恢复很必要。
7:SGA主要有那些部分,主要作⽤是什么
SGA:db_cache/shared_pool/large_pool/java_pool
db_cache:
数据库缓存(Block Buffer)对于Oracle数据库的运转和性能起着⾮常关键的作⽤,
它占据Oracle数据库SGA(系统共享内存区)的主要部分。Oracle数据库通过使⽤LRU
算法,将最近访问的数据块存放到缓存中,从⽽优化对磁盘数据的访问.
shared_pool:
共享池的⼤⼩对于Oracle 性能来说都是很重要的。
共享池中保存数据字典⾼速缓冲和完全解析或编译的的PL/SQL 块和SQL 语句及控制结构
large_pool:
使⽤MTS配置时,因为要在SGA中分配UGA来保持⽤户的会话,就是⽤Large_pool来保持这个会话内存
使⽤RMAN做备份的时候,要使⽤Large_pool这个内存结构来做磁盘I/O缓存器
java_pool:
为java procedure预备的内存区域,如果没有使⽤java proc,java_pool不是必须的
8:oracle系统进程主要有哪些,作⽤是什么
数据写进程(dbwr):负责将更改的数据从数据库缓冲区⾼速缓存写⼊数据⽂件
⽇志写进程(lgwr):将重做⽇志缓冲区中的更改写⼊在线重做⽇志⽂件
系统监控(smon) :检查数据库的⼀致性如有必要还会在数据库打开时启动数据库的恢复
进程监控(pmon) :负责在⼀个Oracle 进程失败时清理资源
检查点进程(chpt):负责在每当缓冲区⾼速缓存中的更改永久地记录在数据库中时,更新控制⽂件和数据⽂件中的数据库状态信息。
归档进程(arcn) :在每次⽇志切换时把已满的⽇志组进⾏备份或归档
作业调度器(cjq) :负责将调度与执⾏系统中已定义好的job,完成⼀些预定义的⼯作.
sql查询面试题恢复进程(reco) :保证分布式事务的⼀致性,在分布式事务中,要么同时commit,要么同时rollback;
三:备份恢复类
1:备份如何分类
逻辑备份:exp/imp
物理备份:
RMAN备份
full backup/incremental backup(累积/差异)
热备份:alter tablespace begin/end backup;
冷备份:脱机备份(database shutdown)
2:归档是什么含义
关于归档⽇志:Oracle要将填满的在线⽇志⽂件组归档时,则要建⽴归档⽇志(archived redo log)。
其对数据库备份和恢复有下列⽤处:
<1>数据库后备以及在线和归档⽇志⽂件,在操作系统和磁盘故障中可保证全部提交的事物可被恢复。
<2>在数据库打开和正常系统使⽤下,如果归档⽇志是永久保存,在线后备可以进⾏和使⽤。
数据库可运⾏在两种不同⽅式下:
NOARCHIVELOG⽅式或ARCHIVELOG ⽅式
数据库在NOARCHIVELOG⽅式下使⽤时,不能进⾏在线⽇志的归档,
如果数据库在ARCHIVELOG⽅式下运⾏,可实施在线⽇志的归档。
3:如果⼀个表在2004-08-04 10:30:00 被drop,在有完善的归档和备份的情况下,如何恢复?
⼿⼯拷贝回所有备份的数据⽂件
sql>startup mount;
sql>alter database recover automatic until time '2004-08-04:10:30:00';
sql>alter database open resetlogs;
4:rman是什么,有何特点?
RMAN(Recovery Manager)是DBA的⼀个重要⼯具,⽤于备份、还原和恢复oracle数据库,
RMAN 可以⽤来备份和恢复数据库⽂件、归档⽇志、控制⽂件、系统参数⽂件,也可以⽤来执⾏完全或不完全的数据库恢复。
RMAN有三种不同的⽤户接⼝:
COMMAND LINE⽅式、GUI ⽅式(集成在OEM 中的备份管理器)、API ⽅式(⽤于集成到第三⽅的备份软件中)。
具有如下特点:
1)功能类似物理备份,但⽐物理备份强⼤N倍;
2)可以压缩空块;
3)可以在块⽔平上实现增量;
4)可以把备份的输出打包成备份集,也可以按固定⼤⼩分割备份集;
5)备份与恢复的过程可以⾃动管理;
6)可以使⽤脚本(存在Recovery catalog 中)
7)可以做坏块监测
5:standby的特点
备⽤数据库(standby database):ORACLE推出的⼀种⾼可⽤性(HIGH AVAILABLE)数据库⽅案,
在主节点与备⽤节点间通过⽇志同步来保证数据的同步,备⽤节点作为主节点的备份
可以实现快速切换与灾难性恢复,从920开始,还开始⽀持物理与逻辑备⽤服务器。
9i中的三种数据保护模式分别是:
1)、MAXIMIZE PROTECTION :最⼤数据保护与⽆数据分歧,LGWR将同时传送到备⽤节点,
在主节点事务确认之前,备⽤节点也必须完全收到⽇志数据。如果⽹络不好,引起LGWR不能传送数据,将引起严重的性能问题,导致
主节点DOWN机。
2)、MAXIMIZE AVAILABILITY :⽆数据丢失模式,允许数据分歧,允许异步传送。
正常情况下运⾏在最⼤保护模式,在主节点与备⽤节点的⽹络断开或连接不正常时,⾃动切换到最⼤性能模式,
主节点的操作还是可以继续的。在⽹络不好的情况下有较⼤的性能影响。
3)、MAXIMIZE PERFORMANCE:这种模式应当可以说是从8i继承过来的备⽤服务器模式,异步传送,
⽆数据同步检查,可能丢失数据,但是能获得主节点的最⼤性能。9i在配置DATA GUARD的时候默认就是MAXIMIZE PERFORMANCE
6:对于⼀个要求恢复时间⽐较短的系统(数据库50G,每天归档5G),你如何设计备份策略
rman/每⽉⼀号 level 0 每周末/周三 level 1 其它每天level 2
四:系统管理类
1:对于⼀个存在系统性能的系统,说出你的诊断处理思路
1 做statspack收集系统相关信息
了解系统⼤致情况/确定是否存在参数设置不合适的地⽅/查看top 5 event/查看top sql等
2 查v$system_event/v$session_event/v$session_wait
从v$system_event开始,确定需要什么资源(db file sequential read)等
深⼊研究v$session_event,确定等待事件涉及的会话
从v$session_wait确定详细的资源争⽤情况(p1-p3的值:file_id/block_id/blocks等)
3 通过v$sql/v$sqltext/v$sqlarea表确定disk_reads、(buffer_gets/executions)值较⼤的SQL
2:列举⼏种诊断IO、CPU、性能状况的⽅法
top/vmstat
statspack
sql_trace/tkprof
查v$system_event/v$session_event/v$session_wait
查v$sqlarea(disk_reads或buffer_gets/executions较⼤的SQL)
3:对statspack有何认识
StapSpack是Oracle公司提供的⼀个收集数据库运⾏性能指标的软件包,该软件包从8i起,在9i、10g都有显著的增强
该软件包的辅助表(存储相关参数与收集的性能指标的表)由最初的25个增长到43个
收集级别参数由原来的3个(0、5、10)增加到5个(0、5、6、7、10)
通过分析收集的性能指标,数据库管理员可以详细地了解数据库⽬前的运⾏情况,对数据库实例、等待事件、SQL等进⾏优化调整
利⽤statspack收集的snapshot,可以统计制作数据库的各种性能指标的统计趋势图表。
4:如果系统现在需要在⼀个很⼤的表上创建⼀个索引,你会考虑那些因素,如何做以尽量减⼩对应⽤的影响
在系统⽐较空闲时
nologging选项(如果有dataguard则不可以使⽤nologging)
⼤的sort_ared_size或pga_aggregate_target较⼤
5:对raid1+0 和raid5有何认识
RAID 10(或称RAID 1+0)与RAID 0+1不同,它是⽤硬盘驱动器先组成RAID 1阵列,然后在RAID 1阵列之间再组成RAID 0阵列。RAID 10模式同RAID 0+1模式⼀样具有良好的数据传输性能,但却⽐RAID 0+1具有更⾼的可靠性。RAID 10阵列的实际容量为M×n/2,磁盘利⽤率为50%。RAID 10也需要⾄少4个硬盘驱动器构成,因⽽价格昂贵。
RAID 10的可靠性同RAID 1⼀样,但由于RAID 10硬盘驱动器之间有数据分割,因⽽数据传输性能优良。
RAID 5与RAID 3很相似,不同之处在于RAID 5的奇偶校验信息也同数据⼀样被分割保存到所有的硬盘驱动器,
⽽不是写⼊⼀个指定的硬盘驱动器,从⽽消除了单个奇偶校验硬盘驱动器的瓶颈问题。RAID 5磁盘阵列的性能⽐RAID 3有所提⾼,
但仍然需要⾄少3块硬盘驱动器。其实际容量为M×(n-1),磁盘利⽤率为(n-1)/n 。
五:综合随意类
1:你最擅长的是oracle哪部分?
pl/sql及sql优化
2:喜欢oracle吗?喜欢上论坛吗?或者偏好oracle的哪⼀部分?
喜欢,sql的优化
3:随意说说你觉得oracle最有意思的部分或者最困难的部分
latch free的处理
六.⾯试专题
(1)数据库切换⽇志的时候,为什么⼀定要发⽣检查点?这个检查点有什么意义?
触发dbwr的执⾏,dbwr会把和这个⽇志相关的所有脏队列写到数据⽂件去,减少数据库崩溃的时的恢复时间。
==>你所的只是普通checkpoint 该做的,⽽没有特指Switch log时候的checkpoint的作⽤。
Switch log checkpoint最主要是使当前redo log 状态由 current ==> Active ==> Inactive ,以备重⽤
(2)表空间管理⽅式有哪⼏种,各有什么优劣。
字典管理⽅式和⾃动管理⽅式,⾃动管理⽅式采⽤位图管理extent,减少字典之间的竞争,同时避免了碎⽚
==>ok.
(3)本地索引与全局索引的差别与适⽤情况。
本地索引适⽤于sql语句种限定⼀个范围的查询⽐如时间之类的,全局索引适⽤于在全部记录中查询,⽐如要查询⼀个⼿机号之类的。全局索引总可能出现unused的情况,需要重建
==>
本地索引适合条件中包含partition key的,当然不是绝对
全局索引总可能出现unused的情况,通常我会问那该怎么办?
9i⾥⾯有update global index 的⼦句
(4)⼀个表a varchar2(1),b number(1),c char(2),有100000条记录,创建B-Tree索引在字段a上,那么表与索引谁⼤?为什么?
这个要考虑到rwoid所占的字节数,假设char总是占⽤2字节的情况,⽐较rowid和3
==>另外,table 和 index在segment free block的管理也有差别
(5)9i的data guard有⼏种模式,各有什么差别。
三种模式
maxmize performance 采⽤异步传送
maxmize availablity 允许采⽤异步传送,在两者之间摇摆
==> 不叫摇摆,正常情况maxmize availablity 传输⽅式等同于maxmize protection ,只是在从库Crash时允许primary继续⼯作maxmize protection 采⽤同步传送
==>保证Standby 与 primary 绝对数据⼀致
个⼈以为采⽤maxmize performance好⼀点,对主数据库影响⽐较⼩
(6)执⾏计划是什么,查看执⾏计划⼀般有哪⼏种⽅式。
执⾏计划是数据库内部的执⾏步骤
set autotrace on
select * from table
alter session set event '10046 trace name context forever,level 12 '
⼀般采⽤pl/sql developer,其它的⽐较少⽤,记不住
==>差不多,再加个Explain plan , v$sql_plan
(7)简单描述⼀下nest loop与hash join的差别。
nest loop适⽤于返回结果⽐较⼩的情况。
for loop
对⼩表进⾏遍历
根据⼩表的结果遍历⼤表(⼤表需要索引)
end loop
这个在数据库⾼效设计⾥⾯有很好的解释,⼀时还写不出来
==>⼩表称为驱动的结果集更为贴切
hash join适⽤在返回⼤结果集的情况
==>也未必⼀定⼤结果集
(8)db file sequential read与db file scattered read等待的差别,如果以上等待⽐较多,证明了什么问题?
db file sequential read指的是需要⼀个但当前不在sga中的块,等待从磁盘中读取。db file scattered read需要多个连续的数据库引起等待。
db file sequential read出现⼤量的等待,或许不是个问题。如果这两个事件等待⽐较多,根据p1,p2,p3以及sid检查sql语句,是否有调优的可能
==>db file scattered read基本可以定性为FTS/IFS
l(9)ibrary cache pin与library cache lock是什么地⽅的等待事件,⼀般说明什么问题?
⼀般出现在对package,procedure进⾏编译,add contraint的时候。
==>差不多,说明DDL过多
(10)在⼀个24*7的应⽤上,需要把⼀个访问量很⼤的1000万以上数据级别的表的普通索引(a,b)修改成唯⼀约束(a,b,c),你⼀般会选择怎么做,请说出具体的操作步骤与语句。
不能确定,是否可以采⽤先建索引后建⽴约束
create index idx_w1 on w_1 (a,b,c) online ;
alter table w_1 add constraint uni_w1 unique (a,b,c) novalidate;
==>
差不多,另外,⼀定要考虑⾮繁忙时间
(11)如果⼀个linux上的oracle数据库系统突然变慢,你⼀般从哪⾥去查原因。
先top看看是哪些进程,看看这些进程在做什么
看看v$session_wait
==>
差不多,能加上vmstat , iostat就更好了
(12)说明⼀下对raid5与raid01/10的认识。
raid5采⽤校验信息,硬盘的利⽤率n-1/n, raid10先采⽤先镜像在进⾏条带化,是最⾼效的硬盘利⽤⽅式,硬盘的利⽤率50%
==> 通常会提⼀下redo log 不能 in raid5. 还有 01/10的区别及优劣。