| 
                         转 : oracle 常用知识点  
原文链接:http://blog.csdn.net/weijiaxiaobao/article/details/51323573  
 
Oracle是一个庞大的系统,里面的知识点很多,在学习的时候,看到一些知识点,就贴了下来,尽不知中贴了这么多,就先做个小结吧。里面有的知识点已经单独拿出来写成单篇的blog(http://blog.csdn.net/tianlesoftware)了。有的还没有进行整理。好记性不如烂笔头,不过我用的不是笔。^_^...  
这里面大部分内容都是我泡CSDN论坛的时候整理的,现在要忙其他的事,就很少去了。泡论坛的那段时间,是我进步最快的时间,所以如果想在Oracle上有所发展的朋友,建议也可以去论坛泡泡。看到自己会的知识点,就帮别人解答,不会的就自己研究学习,一段时间下来,会有很大的进步。而且还能认识很多朋友。实在是一举两得的事。  
 
1.每天的8:00到23:00每隔5分钟执行一个sql语句的JOB  
--建立一个存储过程  
CREATEORREPLACEPROCEDUREp_jobtestIS  
v_hhVARCHAR2(2);  
BEGIN  
v_hh:=to_char(SYSDATE,'hh24');  
IFv_hh>='08'ANDv_hh<='22'THEN  
--你的sql语句  
NULL;  
ENDIF;  
END;  
/  
--提交一个JOB  
DECLARE  
v_jobnoNUMBER;  
BEGIN  
dbms_job.submit(v_jobno,  
'p_jobtest;',  
trunc(SYSDATE,'mi')+1/1440,  
'trunc(SYSDATE,''mi'')+5/1440');  
END;  
/  
2.RMAN中的list命令显示的信息是从控制文件里获取的,如果使用rm等命令手工的删除备份文件,这个动作不会同步到控制文件,造成不一致,这种不一致会导致使用rman时报错。可以使用delete删除这些过期的记录,在用就不会报错了。  
RMAN>crosscheckcopy;  
RMAN>listcopy;  
RMAN>deleteexpiredcopy;  
3.触发LGWR进程的条件有:  
1.用户提交  
2.有1/3重做日志缓冲区未被写入磁盘  
3.有大于1M的重做日志缓冲区未被写入磁盘  
4.3秒超时  
5.DBWR需要写入的数据的SCN大于LGWR记录的SCN,DBWR触发LGWR写入。  
4.触发DBWR进程的条件有:  
1.DBWR超时,大约3秒  
2.系统中没有多余的空缓冲区来存放数据  
3.CKPT进程触发DBWR  
5.每隔3秒钟ckpt会去更新控制文件和数据文件,记录checkpoint执行的情况。  
当发生checkpoint时,会把SCN写到四个地方去。  
三个地方于controlfile内,一个在datafileheader。  
6.触发CheckPoint(检查点)条件有很多,比如:  
1.通过正常事务处理或者立即选项关闭例程时(shutdownimmediate或者Shutdownnormal),  
2.当通过设置初始化参数:  
LOG_CHECKPOINT_INTERVAL,  
LOG_CHECKPOINT_TIMEOUT,  
FAST_START_IO_TARGET强制时;  
3.当数据库管理员手动请求时:  
ALtersystemcheckpoint;  
altertablespace...offline;  
4.每次日志切换时;  
altersystemswitchlogfile  
注意:  
1.altersystemswitchlogfile也将触发完全检查点的发生。  
2.alterdatabasedatafile...offline不会触发检查点进程。  
7.RECOVERDATABASEUNTILCANCEL和RECOVERDATABASEUNTILCANCELUSINGBACKUPCONTROLFILE;区别  
1)RECOVERDATABASEUNTILCANCEL==>OPENDATABASERESETLOG  
==>DATAFILEHEADERSCN一定会小于CONTROLFILE的DATAFILESCN  
如果你有进行RESTOREDATAFILE,则该RESTORE的DATAFILEHEADERSCN一定会小于目前CONTROLFILE的DATAFILESCN,此时会无法开启数据库,必须进行mediarecovery。重做archivelog直到该datafileheader的SCN=currentscn  
8.建表前判断表是否存在的存储过程。  
 
在Oracle中没有droptable...ifexists语法。所以我们可以在创建表之前用如下存储过程来判断。  
createorreplaceprocedureproc_dropifexists(  
p_tableinvarchar2  
)is  
v_countnumber(10);  
begin  
selectcount(*)  
intov_count  
fromuser_objects  
whereobject_name=upper(p_table);  
ifv_count>0then  
executeimmediate'droptable'||p_table||'purge';  
endif;  
end;  
9.表属性中pctused,和pctfree作用  
表示数据块什么时候移入和移出freelist。  
pctused:如果数据块的使用率小于pctused的值,则该数据块重新加入到fresslist中。  
pctfree:如果数据块的使用率高于pctfree的值,则该数据块从freelist中移出。  
10.oracle表空间大小没有限制,根存储空间而定。  
oracle9i或以下,单个数据文件最大32G(对于8K的数据块),整个数据库最多有64K个数据文件.单个表空间的数据文件数量没有具体的限制,也应该是在64K以下.oracle10g以上,引入了bigfiletablespace,bigfiletablespace只有一个数据文件,最大为4G*8k=32Tdatabasefilesize:Operatingsystemdependent.Limitedbymaximumoperatingsystemfilesize;typically222(2的22次方)or4Mblocks  
11.Oracle利用现有的表创建一张新表,只要表结构相同  createtabledavidasselect*fromall_userswhere1<>1;    12.循环插入数据  declareiinteger;  begin  foriin1..100000loop  insertintotestvalues(i);  endloop;  commit;  end;    13.开发人员通常习惯赋予所有用户DBA权限,查看权限  Select*FromUser_Role_Privs  Select*FromUser_Sys_Privs    14.看数据文件大小,单位是M  selectround(bytes/(1024*1024),0)total_spacefromdba_data_files  selectsum(bytes/(1024*1024))total_spacefromdba_data_files    15控制文件大小  selectsum(block_size*file_size_blks)/1024/1024fromv$controlfile    16.建立表空间  CREATETABLESPACEdata01  DATAFILE'/oracle/oradata/db/DATA01.dbf'SIZE500M  UNIFORMSIZE128k;#指定区尺寸为128k,如不指定,区尺寸默认为64k删除表空间  DROPTABLESPACEdata01INCLUDINGCONTENTSANDDATAFILES;  修改表空间大小  alterdatabasedatafile'/path/NADDate05.dbf'resize100M  
查看表空间:  
selecttablespace_name,file_name,sum(bytes)/1024/1024table_sizefromdba_data_filesgroupbytablespace_name,file_name;    17.有没有被lock,可以通过这2张dynamicview来确定:  v$locked_object,V$session    可以把该session杀掉。  selectsid,serial#fromv$sessionwhereusername='XXXX'  把得到的sid,serial#号替换到下面的语句中:  altersystemkillsession'SID,SERIAL#'    18.PL/SQLoracle查询前10条信息  SELECT*FROMtableWHEREROWNUM<11  select*from(select*fromtableorderbydesc)whererownum<=5  ==selecttop5*fromtable;    19.查看表上是否存在的索引  select*fromuser_indexeswheretable_name='yourtablename'  createindexIX_Tablename_columnontablename(column)    20.selectid,id2,round((id/id2)*100,2)||'%'percentfromtest;    21.查询表的行数  selectcount(*)fromtable_name;全表扫描,会自已找表有索引列并且该列为非空的(因为只有非空才能确保记录数是全的),走INDEX_FFS.  selectcount(1)fromtable_name;不走索引,效率要高,但在表中有非空索引时也是走INDEX_FFS的    22.用function来查看当前session的trace文件的文件名  如下  createorreplacefunctiongettracenamereturnvarchar2is  v_resultvarchar2(200);  begin  SELECTd.VALUE  ||'/'  ||LOWER(RTRIM(i.INSTANCE,CHR(0)))  ||'_ora_'  ||p.spid  ||'.trc'intov_result  FROM(SELECTp.spid  FROMv$mystatm,v$sessions,v$processp  WHEREm.statistic#=1ANDs.SID=m.SIDANDp.addr=s.paddr)p,  (SELECTt.INSTANCE  FROMv$threadt,v$parameterv  WHEREv.NAME='thread'  AND(v.VALUE=0ORt.thread#=TO_NUMBER(v.VALUE)))i,  (SELECTVALUE  FROMv$parameter  WHERENAME='user_dump_dest')d;    returnv_result;  endgettracename;    运行SQL>selectgettracename()fromdual;即可  GETTRACENAME()  -----------------------------------------------------------------------    F:/DEVELOPER/ORACLE/PRODUCT/10.2.0/ADMIN/ORCL/UDUMP/orcl_ora_3800.trc      23.selectcasewhen(a>b)thenaelsebendfromTableA;  selectgreatest(a,b)fromtb    24.TRUNCATETABLETable_name  使用truncate时,速度比delete,但是系统不做Log。清空表的数据,仅保留类别结构,被删除的数据不能ROLLBACK,这点是与DELETE的主要差别.不能Rollback也就是会删除log文件.在SQLServer里面如果你用Truncate,自动增长的行又会从1开始    25.selectsubstrb('大小abc',1,6)fromdual;  
  26.表中的数据如下图所示  abc  1PP41982SO90029  2PP41982SO90029  只取出字段b,c不重复的字段,    selectb,cfromtgroupbyb,chaving(count(b)<2)    27.查询锁的情况  1).insertintotestvalues(1);  2).selectuserenv('sid')fromdual;  3).select*fromv$lockwheresid=''  sid在v$session中有这个列,可以结合v$session查询更多的信息    28.删除重复行:  SQL>DELETEFROMaWHEREROWIDIN(SELECTMAX(ROWID)FROMa);  已删除1行。  SQL>select*froma;  NAMEIDORDER_TITLE  --------------------------------------------------  中国科学技术大学1科学  中国科学技术大学1科学  SQL>    29.查看索引信息    --查看索引名称  SELECT*FROMUSER_INDEXES;  --查看索引列名  SELECT*FROMDBA_IND_COLUMNS;  SELECT*FROMUSER_IND_COLUMNS;  SELECT*FROMALL_IND_COLUMNS;    30.oracletrunc()函数用法  
  1.TRUNC(fordates)  TRUNC函数为指定元素而截去的日期值。  其具体的语法格式如下:  TRUNC(date[,fmt])  其中:  date一个日期值  fmt日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去  下面是该函数的使用情况:  TRUNC(TO_DATE(’24-Nov-199908:00pm’,’dd-mon-yyyyhh:miam’))  =’24-Nov-199912:00:00am’  TRUNC(TO_DATE(’24-Nov-199908:37pm’,’dd-mon-yyyyhh:miam’,’hh’))=’24-Nov-199908:00:00am’    2.TRUNC(fornumber)  TRUNC函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。  其具体的语法格式如下  TRUNC(number[,decimals])  其中:  number待做截取处理的数值  decimals指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分  下面是该函数的使用情况:  TRUNC(89.985,2)=89.98  TRUNC(89.985)=89  TRUNC(89.985,-1)=80  注意:第二个参数可以为负数,表示为小数点左边指定位数后面的部分截去,即均以0记。    31.local是局部有序,整体无序,global是有序的,所以local可能会比global慢,得看你的sql语句怎么写的,需求是什么样的  global索引->自己想怎么玩就怎么玩  local索引->表怎么玩它就怎么玩    32,查看磁盘物理读写情况:  SELECTNAME,phyrds,phywrts,readtim,writetimFROMv$filestata,v$datafilebWHEREa.FILE#=b.FILE#  ORDERBYreadtimDESC;  
33.从表中筛选出所有能被5整除的value值数据    select*fromtablewheremod(datavalue,5)=0;  
                        (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |