1:列举几种表连接方式
NEST LOOP:适用于某张表定位准确(结果集少)、条件复杂的情况(not in)。SORT MERGE:不等值连接条件、结果是有序的。HASH_JOIN:大表之间的连接、等值的连接
2:不借助第三方工具,怎样查看sql的执行计划
sqlplus的特性set autotrace on、alter session set sql_trace=true;、@$ORACLE_HOME/rdbms/admin/utlxplan---explain plan for、exec dbms_system.set_sql_trace_in_session(158,68,TRUE); --udump
3:如何使用CBO,CBO与RULE的区别
在optimizer_mode=choose时,表有统计信息,优化器将选择CBO。RBO为基于规则的优化器,使用15种级别要点。CBO基于代价(主要指CPU和内存)的优化模式,优化器会根据表、索引等的统计信息,计算使用不同的执行计划的成本,并选择成本最低的一个执行计划
4:如何定位重要(消耗资源多)的SQL
select sql_id from v$sqlarea where optimizer_cost=(select max(optimizer_cost) from v$sqlarea);
select plan_table_output from table(dbms_xplan.display_cursor('sql_id'));
5:如何跟踪某个session的SQL
select sid,serial# from v$session where username='SCOTT';
exec dbms_system.set_sql_trace_in_session(158,68,TRUE); --udump
6:SQL调整最关注的是什么
查看该SQL的response time(db block gets/consistent gets/physical reads/sorts (disk))
7:说说你对索引的认识(索引的结构、对dml影响、对查询影响、为什么提高查询性能)
索引也属于一种segment,由根、枝干和叶子组成。根和枝干中存放键值的范围的引导指针,叶子中存放的是条目,条目中存放的是索引的键值和该数据行的ROWID。索引的叶子间通过双向链表联系在一起,目的是在找到一个叶子后就以找到临近的叶子而不用再次查找根和枝干。索引里面的数据是有序的,占用的空间小,在查询时减少数据库块的读取,可以实现快速定位数据。但会对DML操作产生额外的负担
8:使用索引查询一定能提高查询的性能吗?为什么
当数据分散在表的多个块中(聚集因子)、B-tree索引的选择性比较低(直方图)索引并不会提高查询性能。索引与全表扫描间也有一些平衡点,比如使用并行DML、查询、使用db_file_multiblock_read_count进行更大的IO操作等
9:绑定变量是什么?绑定变量有什么优缺点?
用一个变量来替代SQL中的字面值,Oracle在shared pool中找到相同的SQL语句的该路相对就很大。绑定变量会减少解析,但并不一定使用的就是最优的执行计划
10:如何稳定(固定)执行计划
Outline、hints、设置Oracle的初始化参数
11:和排序相关的内存在8i和9i分别怎样调整,临时表空间的作用是什么
Oracle 9i之前,主要是通过设置sort_area_size、hash_area_size等参数值来管理PGA的使用。Oracle 9i起,引入了自动PGA 管理。设置workarea_size_policy参数。临时表空间用来存放用户的临时数据,当用户对很多数据进行排序时,如果数据量太大,则将数据分割成多份,只取出一份放在PGA中进行排序,其余的放在临时表空间中
12:存在表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql
select * from (select c.*,rownum as rn from (select * from t order by c desc) c) where rn between 21 and 30;
二:数据库基本概念类
1:pctused and pctfree 表示什么含义有什么作用
pctused与pctfree控制数据块是否出现在freelist中,pctfree控制数据块中保留用于update的空间,当数据块中的free space小于pctfree设置的空间时,该数据块从freelist中去掉,当块由于dml操作free space大于pct_used设置的空间时,该数据库块将被添加在freelist链表中2:简单描述table / segment / extent / block之间的关系
普通表和索引就是一个段。每个segment都由一个或多个extent组成,segment一次扩张和收缩的最小单位就是extent。extent 由多个block紧密排列起来。block是Oracle发出I/O请求的最小单位
3:描述tablespace和datafile之间的关系
一个表空间可以包括多个数据文件,而一个数据文件只能属于一个表空间。tablespace是逻辑上的概念,datafile是在物理上储存了数据
4:本地管理表空间和字典管理表空间的特点,ASSM有什么特点
本地管理表空间在数据文件头部选出6个数据块(从3到8),在其中存放bitmap来管理extent的分配和释放。数据字典管理采用两个数据字典表FET$和UET$来管理extent的扩张和收缩。自动段空间管理(ASSM),使用了BMB块(bitmap blocks),这些BMB块与数据块一起分布在整个segment里。防止了对segment header的争用等待
5:回滚段的作用是什么
一致性读(Consistent Read),针对脏读而言,Oracle会将改变前的数据放到undo块里,同时在该undo块里记录删除ITL槽的信息,通过判断SCN找到查询时刻所要的信息,找不到则会发出ORA-1555错误
回滚事务(Rollback Transaction),在执行DML以后,发出rollback命令撤销DML所作的变化。Oracle利用记录在IT槽里记录的undo块的地址找到该undo块,然后从中取出变化前的值,并放入数据块中,从而对事务所作的变化进行回滚
实例恢复(Instance Recovery),在SMON进程完成前滚并打开数据库以后发生。SMON进程会去查看undo segment头部记录的事务表,将其中既没有提交也没有回滚,而是在实例崩溃时被异常终止的事务全部回滚
6:日志的作用是什么
重做日志(Redo Log)用于记录数据库变化,目的是在出现实例崩溃或介质失败时实现实例恢复和介质恢复
归档日志(Archive Log)是非活动重做日志的备份。当数据库出现介质失败时,使用数据文件备份、归档日志和重做日志可以完全恢复数据库
7:SGA主要有那些部分,主要作用是什么
Shared Pool:存放最近执行的SQL语句和数据字典信息,以提高解析效率
Buffer Cache:存放最近访问的数据块信息,从而减少I/O。还提供一致性读、并发访问功能
Log Buffer:记录实例的变化,对日志文件写的缓冲
Large Pool:为大内存操作提供相对的内存空间,提高这些大内存操作的性能
Java Pool:存放Java代码
8:Oracle系统进程主要有哪些,作用是什么
SMON(System Monitor):用于执行实例恢复、合并空间碎片并释放临时段
PMON(Process Monitor):用于监视服务器进程的执行,并在服务器进程失败时清除该服务器进程
DBWR(Database Writer):用于将Buffer Cache的脏缓冲区数据写入到数据文件中
LGWR(Log Writer):用于将Log Buffer所记载的全部内容写入到日志文件中
CKPT(Checkpoint Process):用于发出检查点,检查点会同步数据库的数据文件、控制文件和重做日志文件
ARCn(归档进程):将已经写满的重做日志文件复制到归档目标中
RECO(恢复进程):分布式数据库环境中自动恢复那些失败的分布式事务
Dnnn(调度程序进程):接受用户进程的请求,将他们放入请求队列中,然后为请求队列中的用户进程分配一个服务进程
三:备份恢复类
1:备份如何分类
简单的按照备份进行的方式,可以分为逻辑备份、冷备份、热备份。按照备份的工具,可以分为EXP/IMP备份、OS拷贝、RMAN、第三方工具,如VERITAS
2:归档是什么含义
在归档模式下,所有的数据变化全都可以通过归档日志文件的形式保留下来,因此发生物理损坏时,能够将数据库完全恢复到发生物理损坏的那个时间点上,从而不会发生数据丢失3:如果一个表在2004-08-04 10:30:00 被drop,在有完善的归档和备份的情况下,如何恢复
从备份中还原所有的数据文件,将数据库启动到mount阶段,recover database until time ‘2004-08-04 10:30:00’;以resetlogs打开数据库
4:rman是什么,有何特点
Recovery Manager的工具,方便我们对数据库进行备份和恢复操作。RMAN在连接到目标服务器上时,会创建对应的进程和session,备份时,RMAN会读取目标数据库上的控制文件获得Oracle信息,并建立到备份介质的通道。RMAN备份时,总是一个数据块一个数据块的读取和写入的,这与数据库本身存取数据的方式是相同的。而且,RMAN可以与DBWn进程协调一致,如果在备份某个数据块时,发现它是一个脏数据块,那么它可以等到DBWn进程将内存里的内容刷新到数据文件以后,才备份该脏数据块。RMAN在备份时,只能从物理层面来判断数据块是否被使用。只要某个数据块的头部被格式化过,那么RMAN就认为该数据块被使用过了,就会备份该数据块
5:standby的特点
在Primary Database上产生的日志;产生的日志传送给Standby Database;Standby Database重演这些日志
6:对于一个要求恢复时间比较短的系统(数据库50G,每天归档5G),你如何设计备份策略
每周日完成0级别的备份,周一至周五完成1级别的累积增量备份
四:系统管理类
1:对于一个存在系统性能的系统,说出你的诊断处理思路
首先通过查看session的等待事件找到影响性能的sid与sql_id,根据sid可以找到对应的session发生的所有等待。根据sql_id 查询sql所对应的执行计划,并进行优化。优化中数据库的版本本质的决定了计划,可以设置一些实例的opt参数,比如优化模式、索引的喜好程度,根据业务逻辑进行优化。也可增加或减少索引、更改表结构、修改sql语句以及加提示针对性的进行优化
2:列举几种诊断IO、CPU、性能状况的方法
使用uptime监控CPU的负载,sar –u查看CPU负载分布的快照,top发现最影响性能的用户和PID。使用iostat查找磁盘I/O 瓶颈,sar –d查看块设备的活动。使用vmstat监控系统的负载
3:对statspack有何认识
它在不同的时间点通过脚本查询系统性能表如v$sysstat给系统做快照,将这些统计信息打包生成系统性能报告
4:如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响
首先评估该索引的需要程度,最好在维护时间操作,还要评估该索引是否会对现有的语句造成负面影响。创建索引之前评估索引的大小以及索引所在表空间剩余空间的大小,除此之外,还要评估临时表空间大小是否足够,用于创建索引时的排序操作。最后,可以采用online模式创建。采用大的排序区,并行操作等
5:对raid10 和raid5有何认识
要求较高的空间利用率,对安全性要求不是特别高、大文件存储的系统采用RAID5比较好。相反,安全性要求很高,不计成本,小数据量频繁写入的系统采用RAID10的方式比较好
6.对全表扫描优化
通过重新码放数据,降低高水位、设置pctfree=0,使块存储的数据更多、修改db_file_multiblock_read_count提高io性能、建立索引,避免全表扫描、建立位图索引,提高数据库性能、启动多cpu的特性,并行查询1.请你描述一下oracle架构,包括SGA、相关进程、表空间、数据文件、PGA、参数文件、控制文件等。
Oracle Server由实例和数据库组成。实例是一组内存结构和后台进程的集合。而数据库是一组OS文件的集合。当启动Oracle 数据库时,在nomount阶段,Oracle会根据操作系统的环境变量找到并读取oracle参数文件,启动实例。这个阶段会显示Oracle 分配的内存信息,以及通过v$bgprocess动态性能视图查看到后台进程的信息。在mount阶段,oracle会根据参数文件中记录的控制文件位置读取控制文件,这时Oracle就把实例和数据库关联起来了,这个阶段可以通过v$database和控制文件,日志文件,数据文件相关视图查看到数据库的结构信息。在数据库open以后,Oracle会对数据库的完整性进行校验,如果数据不一致的话,会发生database的recover
当客户端连接到数据库时,如果使用专用连接方式会产生Server process进程,并会为每个进程分配一个PGA区。在执行一条SQL语句时,如果是第一次执行,则会发生硬解析,首先会对SQL的进行语法、权限等信息进行检查,这个过程会加载shared pool中的dictionary cache,然后根据对象的统计信息和当前选择的优化器模式来确定最佳访问路径,并生成最终的执行计划。硬解析结束后,会释放library cache latch,并产生父游标和子游标。如果再次执行该SQL语句,则会使用游标中生成好的执行计划。在返回查询结果时,如果发生排序还会在PGA中UGA的工作区进行排序,这个过程可能会使用临时表空间,如果该SQL对SGA中的数据修改,Oracle还会创建一个Shadow Process进程
2.请你写出SGA中各部分或者总体对应参数文件中的什么变量?PGA是什么作用,哪个参数控制它?
sga_max_size:SGA的最大尺寸、log_buffer:重做日志缓冲区的尺寸、pga_aggregate_target:所有服务器进程可占用的PGA PGA用于存放服务器进程的数据和控制信息,它是与SGA的一块内存区域
3.请你说出几种startup的命令的选项和他们的意义?
nomount:读参数文件、分配内存、启动后台进程、初始化部分v$视图
mount:读参数文件中描述的控制文件,校验控制文件的正确性,将控制文件的内容读入到内存。一旦mount之后,就是将一个没有意义的实例和一个数据库发生了联系
open:读控制文件中描述的数据文件.验证数据文件的一致性,数据库open后,普通用户才可以访问数据库
pifile=filename:使用指定的参数文件打开数据库
4.如果想关闭数据库,有什么选项,各是什么意义?
Shutdown NORMAL:新的会话不接受、等待非活动的会话结束、等待事物结束、产生检查点、停止数据库
Shutdown TRANSACTIONAL:新的会话不接受、不等待非活动的会话结束、等待事物结束、产生检查点、停止数据库Shutdown immediate:新的会话不接受、不等待非活动的会话结束、不等待事物结束、产生检查点、停止数据库
Shutdown abort:新的会话不接受、不等待非活动的会话结束、不等待事物结束、不产生检查点停止数据库
一致性shutdown,产生检测点,数据库再次启动的时候不要恢复.不一致性shutdown,不产生检测点,数据库再次启动的时候需要恢复,自动的,透明的
5.我想知道数据库是否运行在归档模式,使用什么命令或者什么试图?怎样把数据库从非归档切换成归档模式?写出命令或步骤?
查看:archive log list、select log_mode from v$database 切换:1.startup mount 2.alter database archivelog 3.alter database open
6.如果开发组给你了一组创建表的脚本,他希望你把这些数据导到已创建好的一个空数据库中,写出你的规划步骤或者命令?
1.判断导入数据的大小
2.查看默认值与空值与约束信息
3.让活动日志分次落实commit
4.在导入语句中采用格式化选项
7.写出你知道的exp和imp命令的参数和它们的作用,尽量多写?
exp:parfile=e.txt 使用命令加载参数文件userid=scott/tiger用户名口令file=e:\\bk\\1.dmp导出文件名log=e:\\bk\\exp.log导出日志buffer=819200提取行数据的缓冲区feedback=1回显tables=scott.emp导出表owner=scott,u1导出schema
imp:ignore=y忽略建立表的错误,追加数据show=y只看一下过程full=y导入所有下载本文