SGA 参数 实例:


3.简述SGA主要组成结构和用途?

SGA主要由高速数据缓冲区,共享池,重做日志缓存区,JAVA池,和大池组成,SGA随着数据库实例的启动而加载到内存中,数据库实例关闭时,SGA也随着关闭!

DB_cache:缓存数据块,缓存读,也缓存写

Shared_pool:分为库缓存区library cache 和数据字典缓存区data dictionary,缓存sql,执行计划,数据字典,用于存放最近执行过的SQL语句和最近访问过的数据对象声明,包含二类文件:库缓存文件和数据字典缓存文件,

Redo log buffer:存放了所有引起数据库发生改变的日志条目数据块,其中要的目的是为了恢复重做!

Large_pool:大池,用于MTS(多线程服务),parallel并行,rman等要用到,如果是共享模式下,UGA也可能分配在large_pool中。

JAVA_pool:用于java程序,如sql存储过程运行!


4.什么是分区表?简述范围分区和列表分区的区别,分区表的主要优势有哪些?

1、改善查询性能

2、提高数据可用性

3、维护方便

4、均衡I/O


1、selectname,checkpoint_change# from v$datafile; 当前数据文件SCN.在控制文件中。即checkpointscn,表示该数据文件最近一次执行检查点操作时的SCN

2、selectname,last_change# from v$datafile;  数据文件结束SCN,在控制文件中。LAST_CHANGE#,如果数据库非正常关闭值为NULL.正常关闭是关闭时的SCN. 实例恢复就是在打开数据库时检查此参数确定是否需要恢复。数据库OPEN时LAST_CHANGE#也为NULL,因为不确定SCN多少时关闭。

3、selectdbid,checkpoint_change# from v$database;数据库全局-检查点 SCN,在控制文件中


4、selectname,checkpoint_change# from v$datafile_header; 查询数据文件头SCN,在数据文件头





DBA_ROLE_PRIVS        查询某个用户具有的角色或者某个角色下的有哪些用户

select* from dba_role_privs where grantee ='SYS';

select * from dba_role_privs where granted_role ='RESOURCE';


DBA_SYS_PRIVS   查询某个用户具有的系统权限

select grantee,privilege from dba_sys_privs where grantee='XXXX';


ROLE_SYS_PRIVS    显示授予角色的系统权限

select * from role_sys_privs where role = 'RESOURCE'; 查询RESOURCE角色相关的权限

ROLE_TAB_PRIVS    显示授予角色的表权限



User_segments  select segment_name,extents,initial_extent,next_extent,blocks from user_segmentswhere segment_name='T';

User_extents    selectextent_id,bytes,blocks from user_extents where segment_name ='T';



当发生DML操作时,既要生成REDO(针对DML操作本身的REDO ENTRY),也要生成UNDO(用于回滚该DML操作,记录在UNDO表空间中)

比如插入一个表,会在数据库缓冲区里生成UNDO块,索引块,表数据块。这些块都会在重做日志缓冲区里生成相应的REDO信息来保护自己。




执行commit时:

1、为事务生成一个SCN,每次有人commit,scn都会增1

2、LGWR将所有余下的缓存重做日志条目写入磁盘,并把SCN记录到在线重做日志文件中。

3、事务条目会从V$TRANSACTION中删除,V$LOCK中记录的会话持有的锁会被释放。

4、如果事务修改的某些块还在缓冲区缓存中,则会发生块清除,块清除是指清除存储在数据块首部与锁相关的信息,其实就是清除块上的事务信息,这样下一个访问这个块的人就可以直接重用这个块了。

v$transaction

v$lock




执行rollback时:

1、撤销已做的所有修改:从UNDO段中读回数据,然后实际逆向地执行前面所做的的操作,并将UNDO条目标记为已用,

2、会话持有的锁都将释放。


块清除:


一般情况下,提交(commit)时处理的步骤之一便是清除块:如果块还在SGA中,就要再次访问这些块,如果可以访问,则对这些块完成“清理”。这个过程称为提交清除(commit cleanout),即清除已修改块上的事务信息,最理想的是,COMMIT可以完成块清除,这样后面的select(读)就不必再清理了。但ORACLE会记录已经修改的块列表,这些列表都有20个块,ORACLE根据需要分配多个这样的列表,直至达到某个临界点,如果我们修改的块超过了块缓冲区缓存大小的10%,ORACLE就会停止为我们分配新的列表,COMMIT作用时,ORACLE会处理这些包含20个块指针的列表,如果块仍可用,它会执行一个很快的清理,所以只要我们修改的块数没有超过缓存中总块数的10%,而且块仍在缓存中而且可用,ORACLE就会在提交中清理这些块,否则,便会将其忽略,也就是不清理。

以下是会产生这种块不清理的一些情况:

1、将大量新数据比量加载到数据仓库中

2、在刚刚加载的所有数据上运行UPDATE(产生需清理的块)


如果块需要清理,第一个接触这个数据块的查询会带来一些额外的处理,如果认识到这一点,你就应该在UPDATE之后主动的接触数据,更好的做法:如果批量加载了数据或UPDATE了数据后,最好以某种方式刷新统计一下数据,通过运行DBMS_STATS等实用程序来收集统计,这样就能更好的清理所有的块,因为这类统计只是使用SQL来查询数据,会在查询中很自然地完成块清除。


一致性读:

一致性讯是为了保证数据的一致性,在BUFFERCACHE中的数据块上都会有最后一次修改数据块时的SCN

如果一个事务需要修改数据块中的数据,会先在回滚段中保存一份修改前数据和SCN的数据块,然后再更新BUFFER CACHE中的数据块上的数据以及SCN,并标识其为脏数据

当其它进程读取数据块时,会先比较数据块上的SCN和进程自己的SCN,如果数据块上的SCN小于等于进程本身的SCN,则直接读取数据块上的数据,

如果数据块上的SCN大于进程本身,则会从回滚段中找出修改前的数据块读取数据。


强烈建议采用自动UNDO管理,手动UNDO管理时,UNDO段在一定时间内会回绕,并尽可能快的重用UNDO空间,而自动UNDO管理,在空间不足的时候可以扩展UNDO段(重新分配区空间)以满足UNDO_RETENTION,而不是回绕,可以大大减少ORA-01555的错误!

适当设置UNDO_RETENTION参数(要大于执行运行时间最长的事务所需的时间)



Char nchar varchar2 nvarchar2

为什么使用varchar2而不使用char

Create table t(a char(20),b varchar2(20))

Insert into t values('hello world','hello world')

此时a列因为使用char所以会在数据块尾部填充空格来达到20的长度!而b列则不会

此时

Select  * from t where a='hello world';或者select * from t where b='hello world';

都可以查出值,看来正常

但如果这样查询

Select * from t where a = b '

此时便会no rows selected

因为'helloworld' 与'hello world         '(后面带空格)会被理解为是不一样的值

必须去空格或者在另一个值上加空格才行

Select * from t where trim(a)=b;

Select * from t where a=rapd(b,20);

这种情况在使用绑定变量的时候,容易导致值对不上,导致变量绑定用不上!

但这种情况在mysql能查询正常,Mysql在检索数据时会默认去掉填充的空格



oracle查询最耗资源的语句

利用top等在操作系统上查出相关最占资源的ORACLE进程ID

v$process上的spid就是此进程ID号

然后利用v$process上的SPID 和ADDR在v$session上所对应的PADDR相同,由此找出v$session中的sid,sql_hash_value等值

然后利用这二个值在v$sqltext找出SQL_TEXT字段,得知语句

select s.sid,s.sql_hash_value from v$session s,v$process p  where p.addr=s.paddr and spid='10988';

Select sql_text from v$sqltext where hash_value=


oracle查找引起等待的语句:

select sid,SERIAL#,BLOCKING_SESSION_STATUS,BLOCKING_SESSION,BLOCKING_INSTANCE fromv$session;

查出blocking_session所对应的sid号以及导致这条语句等待的语句的SID


再根据SID查出在v$session查出hash_value,再利用hash_value在v$sqltext中查出具体语句!

可用使用altersystem kill session 'sid,SERIAL#'杀掉这个语句



ORACLE面试题:


SQL,表,索引设计部分:


1.第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列


第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。


第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。


第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。


设计表主键:

主键应该是对用户没有意义的,在一些数据表的设计中,不建议以材料编码或×××号码及员工工号作为主键,主键应该只是一些具有唯一性标识的标识符,比如自增长的数字等。

主键应该是单列的,以便提高连接和筛选操作的性能,复合主键通常导致不良的外键,因此要尽量避免。

主键应该是不能被更新的,主键的主要作用是唯一标识一行,更新则违反了主键无意义的原则。

主键不应该包含动态更新的数据,比如时间戳、创建时间或修改时间等这些动态变化的数据。

主键最好由计算机自动生成,在Oracle中可以使用序列来为主键列生成值。

alter table test add constraint id_con primary key(id);

Select * from User_constraints


外键约束:

列级别写法:[CONSTRAINT constraint_name]  

REFERENCES table_name (column_name)  

[ON DELETE {CASCADE|SET NULL}]

表级别写法:

CONSTRAINT invoice_fk_vendors FOREIGN KEY (vendor_id) REFERENCES vendors(vendor_id) ON DELETE CASCADE

检查约束:

[CONSTRAINT constraint_name] CHECK (condition)


好的建表习惯:

可以在创建列在每列的后面分别写上约束,但更好的习惯是在表级别在建表语句的后面统一实现约束

CONSTRAINT invoice_pk PRIMARY KEY (invoice_id),

CONSTRAINT vendor_id_un UNIQUE (vendor_id)


创建索引常见的10条原则。

小表不需要建立索引,比如emp表只有数十行记录,可以不建立索引。

对于大表而言,如果经常查询的记录数目少于表中总记录数目的15%,可以创建索引。这个比例并不绝对,它与全表扫描速度成反比。

对于大部分列值不重复的列可建立索引。

对于基数大的列,适合建立B树索引,而对于基数小的列适合建立位图索引。

对于列中有许多空值,但经常查询所有的非空值记录的列,应该建立索引。

LONG和LONG RAW列不能创建索引。

经常进行连接查询的列上应该创建索引。

在使用CREATE INDEX语句创建查询时,将最常查询的列放在其他列前面。

维护索引需要开销,特别是对表进行插入和删除操作时,因此要限制表中索引的数量。对于主要用于读的表,索引多就有好处,但是,如果一个表经常被更改,则索引应少点。

在表中插入数据后创建索引。如果在装载数据之前创建了索引,那么当插入每行时,Oracle都必须更改每个索引。


ALTER INDEX idx_ename_empno COALESCE;合并索引

ALTER INDEX idx_ename_empno REBUILD TABLESPACE users;重建索引并更改索引所在表空间!



ORACLE的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据中而互不干扰,不用担心会破坏或影响其他SESSION/TRANSACTION的数据,这也是数据安全的一种解决方法。

时表分为SESSION、TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。

create global temporary table 临时表名 on commit preserve|delete rows  

用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表




在什么时候使用分区表呢?

1、表的大小超过2GB。

2、表中包含历史数据,新的数据被增加都新的分区中。

分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能


1.范围分区:范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期,每一个分区都必须有一个VALUES LESS THEN子句,

按时间

SQL> create table fnn_test2

 2  (

 3    KPI_CODE      VARCHAR2(10),

 4    KPI_NAME      VARCHAR2(60),

 5    FA_BIL_CODE   VARCHAR2(10),

 9    PAYOUT_RATE   NUMBER(10,2),

10    ACCT_YEAR     VARCHAR2(4)

11  )

12   partitionby range (ACCT_YEAR)

13  (

14    partitionPART_2009 values less than ('2010'),

15    partitionPART_2010 values less than ('2011'),

16    partitionPART_2011 values less than ('2012'),

17    partitionPART_2012 values less than ('2013')

18  );


按ID

SQL> create table fnn_test1

 2  (

 3    KPI_ID        VARCHAR2(10),

 4    KPI_NAME      VARCHAR2(60),

 5    FA_BIL_CODE   VARCHAR2(10),

 9    PAYOUT_RATE   NUMBER(10,2),

10    ACCT_YEAR     VARCHAR2(4)

11  )

12   partitionby range (KPI_ID)

13  (

14    partition PART1 valuesless than ('10000'),

15    partitionPART2 values less than ('20000'),

16    partitionPART3 values less than ('30000'),

17    partitionPART4 values less than ('40000')

18  );




2.列表分区:该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。


3.散列分区(hash):N个区,N最好是2的幂次方。hash分区最主要的机制是根据hash算法来计算具体某条记录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

4.组合范围列表分区

5.复合范围散列分区




5.RMAN备份案例

1.星期天晚上      -level 0 backup performed(全备份)

2.星期一晚上      -level 2 backup performed

3.星期二晚上      -level 2 backup performed

4.星期三晚上      -level 1 backup performed

5.星期四晚上      -level 2 backup performed

6.星期五晚上      -level 2 backup performed

7.星期六晚上      -level 2 backup performed


如果星期二需要恢复的话,只需要1+2,

如果星期四需要恢复的话,只需要1+4,

如果星期五需要恢复的话,只需要1+4+5,

如果星期六需要恢复的话,只需要1+4+5+6.


Run{

Configure retention policy to recovery window of 7 days

Configure retention policy to redundancy 3

Configure controlfile autobackup on

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPEDISK TO '%F';

Backup database format'/oracle/data';

allocate channel c1 device type disk format'D:/autobackup/rman/data_%T_%U';


CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; #default


CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default


backup incremental level=0 database skip inaccessible filesperset 10

  plus archivelog filesperset 20 delete all input;

Release channel c1

}


Create tablespace catalogtbsdatafile '/oracle/catalog.dbf' size 50M

Grant connect,resource,recovery_catalog_owner to rmanctidentified by rmanct

Rman catalog rmanct/rmanct

Create catalog tablespace catalogtbs

Register database



controlfile 丢失:

Set dbid=

startup nomount;

restore controlfile from autobackup;

alter database mount;

recover database;

alter database open resetlogs;

使用备份的控制文件恢复后,必须recoverdatabase 并且以open resetlogs打开数据库



SPFILE丢失:

startup nomount;

set dbid 3988862108;

restore spfile from autobackup;

shutdown immediate;

set dbid 3988862108;

startup;

6.用rman写一个备份语句:备份表空间TSB,level 为2的增量备份。

Backup incremental level =2 tablespace tsb


7.查看表的DDL结构

select dbms_metadata.get_ddl('TABLE','TEST') from dual;

8.查看SQL执行计划

Explain plan for select * from test;

Select * from table(dbms_xplan.display);

或者

Set autotrace traceonly

Set autotrace on

Set autotrace on explain

Set autotrace on statistics



数据库基本概念类

1:pctused and pctfree表示什么含义有什么作用

pctusedpctfree控制数据块是否出现在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:描述tablespacedatafile之间的关系

一个tablespace可以有一个或多个datafile,每个datafile只能在一个tablespace,table中的数据,通过hash算法分布在tablespace中的各个datafile,tablespace是逻辑上的概念,datafile则在物理上储存了数据库的种种对象。

4:本地管理表空间和字典管理表空间的特点,ASSM有什么特点

本地管理表空间(Locally ManagedTablespace简称LMT)

8i以后出现的一种新的表空间的管理模式,通过位图来管理表空间的空间使用。

字典管理表空间(Dictionary-ManagedTablespace简称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主要有那些部分,主要作用是什么

SGAdb_cache/shared_pool/large_pool/java_pooldb_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,完成一些预定义的工作.

恢复进程(reco) :保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback;

SQL tuning类参考解答:

1:列举几种表连接方式程序代码

hash join/merge join/nest loop(clusterjoin)/index join

2:不借助第三方工具,怎样查看sql的执行计划

程序代码

setautot on

explain plan set statement_id =&item_id for &sql;

select * from table(dbms_xplan.display);

3:如何使用CBO,CBORULE的区别

optimizer_mode=choose,如果表有统计信息(分区表外),优化器将选择CBO,否则选RBORBO遵循简单的分级方法学,使用15种级别要点,当接收到查询,优化器将评估使用到的要点数目, 然后选择最佳级别(最少的数量)的执行路径来运行查询。

CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。

4:如何定位重要(消耗资源多)SQL


程序代码

selectsql_text

fromv$sql

wheredisk_reads> 1000 or (executions> 0 and buffer_gets/executions > 30000);


5:如何跟踪某个sessionSQL


程序代码

execdbms_system.set_sql_trace_in_session(sid,serial#,&sql_trace);

selectsid,serial# from v$session where sid= (select sid from v$mystat where rownum = 1);

execdbms_system.set_ev(&sid,&serial#,&event_10046,&level_12,”);


6:SQL调整最关注的是什么


查看该SQLresponse time(db block gets/consistent gets/physical reads/sorts(disk))


7:说说你对索引的认识(索引的结构、对dml影响、为什么提高查询性能)


b-tree index/bitmap index/functionindex/patitional index(local/global) 索引通常能提高select/update/delete的性能,会降低insert的速度,


8:使用索引查询一定能提高查询的性能吗?为什么


索引就是为了提高查询性能而存在的, 如果在查询中索引没有提高性能, 只能说是用错了索引,或者讲是场合不同


9:绑定变量是什么?绑定变量有什么优缺点?


绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,查询bindvalue在运行时传递,然后绑定执行。优点是减少硬解析,降低CPU的争用,节省shared_pool ;缺点是不能使用histogram,sql优化比较困难


10:如何稳定(固定)执行计划


程序代码

query_rewrite_enabled = true

star_transformation_enabled = true

optimizer_features_enable = 9.2.0


创建并使用stored outline

oracle can automatically create outlinesfor all SQL statements, or you can create them for specific SQL statements. Ineither case, the outlines derive their input from the optimizer.


oracle creates stored outlinesautomatically when you set the initialization parameter Create_STORED_OUTLINESto true. When activated, oracle creates outlines for all compiled SQLstatements. You can create stored outlines for specific statements using theCreate OUTLINE statement.


Creating Outlineshttp://download-west.oracle.com/docs/cd/B19306_01/server.102/b14211/outlines.htm


11:和排序相关的内存在8i9i分别怎样调整,临时表空间的作用是什么


Oracle 8isort_area_size/sort_area_retained_size决定了排序所需要的内存


如果排序操作不能在sort_area_size中完成,就会用到temp表空间


Oracle 9i中如果workarea_size_policy=auto,


排序在pga内进行,通常pga_aggregate_target1/20可以用来进行disk sort;


如果workarea_size_policy=manual,排序需要的内存由sort_area_size决定


在执行order by/groupby/distinct/union/create index/index rebuild/minus等操作时,


如果在pgasort_area_size中不能完成,排序将在临时表空间进行(disk sort),


临时表空间主要作用就是完成系统中的disksort.


12:存在表T(a,b,c,d),要根据字段c排序后取第2130条记录显示,请给出sql


程序代码

create table t(a number(,b number(,cnumber(,d number();

/

begin

for i in 1 .. 300 loop

insert into tvalues(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 byc desc) x where rownum< 30

minus

select * from (select * from test order byc desc) y where rownum< 20 order by 3 desc


相比之 minus性能较差


备份恢复类

1:备份如何分类

逻辑备份:exp/imp

物理备份:

RMAN备份

full backup/incremental backup(累积/差异)

热备份:altertablespacebegin/end backup;

冷备份:脱机备份(database shutdown)


2:归档是什么含义

关于归档日志:Oracle要将填满的在线日志文件组归档时,则要建立归档日志(archived redolog)

其对数据库备份和恢复有下列用处:

数据库后备以及在线和归档日志文件,在操作系统和磁盘故障中可保证全部提交的事物可被恢复。

在数据库打开和正常系统使用下,如果归档日志是永久保存,在线后备可以进行和使用。


数据库可运行在两种不同方式下:

NOARCHIVELOG方式或ARCHIVELOG 方式数据库在NOARCHIVELOG方式下使用时,不能进行在线日志的归档,如果数据库在ARCHIVELOG方式下运行,可实施在线日志的归档。


3:如果一个表在2004-08-04 10:30:00 drop,在有完善的归档和备份的情况下,如何恢复?

手工拷贝回所有备份的数据文件

startup mount;

sql alter database recover automatic untiltime 2004-08-04:10:30:00;

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推出的一种高可用性(HIGHAVAILABLE)数据库方案,

在主节点与备用节点间通过日志同步来保证数据的同步,备用节点作为主节点的备份

可以实现快速切换与灾难性恢复,920开始,还开始支持物理与逻辑备用服务器。

Oracle 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 statspack收集系统相关信息

了解系统大致情况/确定是否存在参数设置不合适的地方/查看top 5 event/查看top sql

2 v$system_event/v$session_event/v$session_wait

v$system_event开始,确定需要什么资源(db filesequential 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:列举几种诊断IOCPU、性能状况的方法

top/vmstat

statspack

sql_trace/tkprof

v$system_event/v$session_event/v$session_wait

v$sqlarea(disk_readsbuffer_gets/executions较大的SQL)

3:statspack有何认识

StapSpackOracle公司提供的一个收集数据库运行性能指标的软件包,该软件包从8i起,在9i10g都有显著的增强。该软件包的辅助表(存储相关参数与收集的性能指标的表)由最初的25个增长到43个。收集级别参数由原来的3(0510)增加到5(05 6710)通过分析收集的性能指标,数据库管理员可以详细地了解数据库目前的运行情况,对数据库实例、等待事件、SQL等进行优化调整。利用statspack收集的snapshot,可以统计制作数据库的各种性能指标的统计趋势图表。

4:如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响

在系统比较空闲时;nologging选项(如果有dataguard则不可以使用nologging)大的sort_ared_sizepga_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 5RAID 3很相似,不同之处在于RAID 5的奇偶校验信息也同数据一样被分割保存到所有的硬盘驱动器,而不是写入一个指定的硬盘驱动器,从而消除了单个奇偶校验硬盘驱动器的瓶颈问题。RAID 5磁盘阵列的性能比RAID 3有所提高,但仍然需要至少3块硬盘驱动器。其实际容量为M×(n-1),磁盘利用率为(n-1)/n