cr块和latch buffer cache chain
Cr块和latch buffer cache chainCr块consistent read 块也就是用来维护oracle的读一致性的数据块。当查询某些数据的时候,发现数据块的版本比我们要查询的新,例如session1执行了dml操作并没有提交,session2此时查找跟session1相关的dml操作的数据信息,此时查询的数据却是原来的数据信息。查询的过程会在undo段中查找该数据块的前映像后,然后把前映像和current块合并形成了一个CR block,通过查询cr block就可以满足数据的一致性了。CR block存在与sga的buffer cache中,在db cache里申请一个数据块,然后对应的回滚段的前映像生成cr b
看yangtingkun大师blog有感
看了ITPUB斑竹的yangtingkun的关于ITPUB名人榜第二期访谈,觉得自己真的好垃圾,好懒惰。陆陆续续写blog有快三个月了吗,不过有时候真的有点喜欢偷懒,把遇到的oracle的问题慢慢简化成blog当成以后查看的资料,还有督促自己学习oracle每天必不可少一种方法吧!前辈们对oracle了解比俺深刻多了都还在每天坚持blog,充电学习,自己更没有任何理由偷懒了!正如所说oracle之路才刚刚开始![@more@]
两种形式的行转列
很早之前就遇到网友说过sql查询中的行转列。刚好有两个分类别的行转列。创建一个测试表scCreate table sc(sid number ,cid varchar2(10) ,grade number)SID CID GRADE20060101 语文 98.120060102 语文 65.520060101 数学 87.620060102 数学 88.620060101 英语 65.220060102 英语 79.920060103 语文 61.220060103 数学 66.520060103 英语 83.9利用case whenSelect sid, sum(case when cid=’语文’ then grade end) 语文,sum(case when cid=’数学’ then grade end) 数学,sum(case when cid=’英语’ then grade end) 英语from sc group
近段时间oracle学习随笔
又快十一了,想想上个十一真的还没开窍了,毕业时心想如果能做IT 软件开发的一定好好干,可是毕业的先半年确实没有学什么东西。不过还好今年年初开始接触oracle数据库,刚开始练基本的sql语句都不会写,其实刚开始接触也是想玩玩,后来慢慢觉得oracle其实很有意思,主要是公司的老手们总是要我们自己解决。哎,人有时候是被逼的啊! 近段时间学习还是觉得效率不高,心想年底前还是有个小目标:认真通读一遍oracle concept完成eygle的循序渐进的深刻阅读,这本书买了有好半年了吧,但是刚开始买的时候就有点后悔了,因为那是刚接触oracle勉
b+ and bitmap index
索引是优化查询的一个很重要但是又很复杂的技术手段。有时候提到查询更多的网友都是create 索引,但是索引的创建和sql优化器以及具体业务情况都是很有关系的。以及具体索引的类别,具体是b+树索引还是bitmap索引。创建一个默认b+树单列索引Create index index_test01 on test01(id);Create默认的b+树基于函数的索引Create index index_fun_test05 on test05(substr(id,1,1) 创建一个基于函数的索引,在9.2.0.3之前query_rewrite_enabled参数必须为true,基于函数的索引才能生效,后续版本中基于函数的索引跟此参数已经无关,其中基于函数的
trigger的一些记载和自治事务的一个练习
很早之前就接触了trigger,不过长时间不用貌似其中有些细节真记不住了。Trigger分为dml触发器,数据库级触发器,ddl触发 instead of触发先前写过两张表的同步的一个dml触发Create or replace trigger dml_trigger01After insert or update or deleteOn student01For eache rowIf inserting thenInsert into student02 values(:new.id.,:new:name);Elsif updating thenUpdate student02 set id=:new.id,name=:new.name where id=:old.id and name=:old.name;Else deleting thenDelete student02 where id=:old.id and name=:old.name;End i
回滚段记载
回滚段管理:回滚段的头部包含了使用该回滚段的事务的信息,一个事务只能只用一个回滚段,而一个回滚段可以存放多个事务的回滚段信息。事务级的读一致性:Set transaction read onlyset transaction isolation level serializable;(对数据库的并发性和性能带来影响)上述都可以设置事务期间的数据不会因为别的事务提交带来的影响。靠回滚段来实现的。回滚段种类:System表空间的系统回滚段和非系统回滚段。System系统回滚段用于存放系统表空间中对象的数据前映像。非系统回滚段:又分为公有回滚段和私有回滚段,私有回滚段应在参数文件的
latch的基本记载
Latch的基本概念:Larch是oracle提供的轻量级锁资源,用于快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,只工作在内存中。可以简单的说:内存中资源的锁叫latch,数据库对象(表,索引等)的锁是lock。读取一个数据块的数据时,会获得该数据块的latch,这个过程叫做pin住,如果多个进程同时请求,则进程中将出现竞争。获取latch中不存在队列机制,前面的进程释放latch,后面的进程将同时竞争请求,不存在顺序的概念,也是因为latch的获取和释放都非常快。Latch和lock区别:1 latch是对sga中的数据块提供的互斥访问机
自治事务的记载
自治事务:一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的事务的影响。 如果session从B事务开始——A事务开始和结束——B事务结束上述的A事务不受没有完成的B事务的影响,然后A事务执行完毕后再次回到B事务执行没有完成的B事务。 通过pragma autonomous_transaction将一个pl/sql程序结构设定为自治事务,pragma是编译器指令,可以将procedure function package等顶级匿名块定义成自治的程序结构。 罗嗦了半天直接来测试下: 首先创建一个procedure—noautonomous_transaction
resetlogs和noresetlogs重建ctl 表空间脱机联机和scn联系
刚开始觉得数据库恢复这部分知识要点还算清楚了,现在觉得以前得有些理解都错了,看来oracle这行还真不能说自己很会,oracle的内部世界可能现在的我根本无法去想象。哎,坚持oracle热爱oracle吧。入门找到属于自己的领地吧!关于表空间和检查点的:表空间脱机Alter tablespace users offline此时将表空间离线将触发检查点,所以此时的控制文件中记录该数据文件检查点Select checkpoint_change# from v$datafile数据文件头部记载的数据文件启动scn也会变化Select checkpoint_change# from v$datafile_header如果此时再进行表空间上线又会触发
分析函数rank() row_number
很早之前就听网友谈过oracle的分析函数的好处,这两天有些需求不然不觉中用到了分析函数。分析函数和聚合函数根本不同之处在于聚合函数sum average max min count等只能返回一行,而分析函数可以按组返回多行。开窗函数的理解:也就是over(partition by class order by s),开窗函数指定了分析函数工作的窗口大小。(具体开窗函数中一些幅度值限制可以参考tom的export one-on-one)create table student(name varchar2(10),class number,s number)然后插入一些数据,例如此时student表中的数据:select * from studentname class sa
v$session_wait和v$session_event视图
看eygle循序渐进中提到了oracle 几个很重要的视图。关于oracle的等待事件v$session_wait和v$session_event应该是检查oracle数据库性能瓶颈的很有用的视图。V$session_wait提供了任何情况下session在数据库中当前等待什么(如果session当前什么也没有做,显示最后的等待事件)V$session_wait中常用column:Sid: session id对应与v$session等视图的sidEvent:session等待的事件Seq#:等待事件触发每次加1P1,P2,P3 等待事件中等待的信息(P1-与等待相关的数据文件的全部文件数量P2-P1中得数据文件的块数量P3-描述等待产生原因的代码)P1TEX
move和shrink的原理和redo的产生 ,利用rowid的含义实用block个数
前几篇blog中整理了关于HWM和delete drop truncate的一些关系。补充一下HWM的另外一些东东。首先减少HWM的方法上次提到了move和shrinkAlter table test09 move 通过move移动对象,但是move之后,需要重建索引,而且move的过程中会影响在线使用Alter index indexName rebuildMove原理是创建一个新表,所以需要两倍的空间,然后将原表的数据插入新的表中,然后在删除原来的表和数据,释放空间。可以看出move的过程中数据行的rowid改变了,所以需要重构索引。利用shrink在线收缩表内的HWMAlter table test09 enable row movementAlter table
data block extent and segment-03
今天继续啃oracle concept中的Data blocks extent and segments。其中的临时段 临时表和排序段看了好迷惑。临时段:当oracle处理一个查询时,可能需要为sql解析与执行的中间结果分配临时表空间,oracle会自动分配临时段的临时空间。例如当sql执行中需要排序,很有可能需要在临时表空间中分配临时段(排序不在pga的sort area,也没有利用索引来执行)有点需要说明的是:临时表空间的只有一个临时段,当排序等使用临时段的操作结束后,这个临时段不会被删除,将此临时段的区间标记为free供以后排序等使用。临时表空间的临时段是循环使用的,
data block extent and segment-02
继续整理一下oracle体系中的data block exten and segment。前几篇blog中提到了delete drop truncate和高水位线HWM关系。创建table或者index等对象会创建segment,分配extent,此时delete from table无法回收段内的数据扩展的,这些数据块会用于以后段内数据的插入更新操作。扩展的回收:oracle只是会对block更新,然后在local管理的tablespace对数据文件头部位图信息进行相应更新,数据文件的前两个块使用来记载数据文件头部信息,第三个块则是位图信息。Alter system dump datafile 4 block min 1 max 3;可以具体去dump数据文件数据块来
oracle commit随笔记载
在oracle中的commit经常使用,但是commit前后数据库内部所做的事情还是很值得推敲的。网友又提到了一个dml语句,没有commit会产生redo吗,产生redo肯定是的,而且在commit之前已经产生了大量的redo。SQL> select name,value from v$mystat a,v$statname b where a.statistic#=b.statistic# and name='redo size'; NAME VALUE ---------------------------------------------------------------- ---------- redo size 1372 SQL> insert into test01 values(1,'pom'); 1 row inserted SQL> select name,value from v$mystat a,v$s
v$sesstat,v$mystat,v$statname和v$sysstat视图简介
今天早上打开ITPUB的论坛,提到了查询dml操作期间,没有commit之前是否产生redo log,就涉及到如何查看current session产生的redo的计算,因为前段时间接触过统计的几个视图V$sysstat v$mystat v$session v$statname,翻看资料 实验记载下:V$sysstat是系统资源使用情况的统计分析,sys会不自然的想到conn / as sysdba,Desc v$sysstatName----------Stattistic# :标识,用来识别nameName Classs 统计类别Value Stat_id 统计标识Name中包括的统计信息: redo size(产生的redo log) user commits/user rollback(某种操作的次数) cpu u
聚簇 聚簇索引和聚簇下的表的记载
前段时间又重新理解了一下cluster,觉得有必要整理以后再拿来看看,cluster当初自己也是很理解不通,现在自己又在看oracle concept就查查资料扫盲了,要从根本上理解。 根据一个表占用一个segment,然后为其分配extent,所以此extent中的block都是存储的这个表的数据信息,不存在别的表的数据信息。这样如果做表的关联时:select a.id ,b.name from test01 a,test02 b where a.id=b.id and a.id=10;很明显要访问a表的block和b表的block,访问过多的数据块,I/O操作会更多消耗资源。簇是用来存储表的方法,一组表有共同的column,聚簇就把这
HWM和delete,drop,truncate的关系
今天下午好好看了oracle中的HWM,也就是高水位线,高水位线是一个段内使用和未使用的数据块的分界线。Select * from user_tables where table_name=’TEST03’其中有blocks,empty_blocks,num_rows其中的blocks也就是此表所占用的block数量,empty_blocks空的block,num_rows数据行数。User_tables中blocks也就是HWMUser_segment数据字典视图:blocks就是此segment分配的blocks总数,header_block就是此段断头所在的数据块编号等。HWM的信息存储在段头中,根据段空间自动管理中是用位图来管理段内的空间分配Delete,truncate和drop和高水
tablespace 大文件,undo,temp tablespace
大文件表空间:大文件表空间增强了oracle数据库的存储能力,一个小文件表空间最多可以包含1024个datafile,大文件表空间只能包含一个datafile,大文件表空间最大容量是小数据文件的1024倍。大文件表空间和小文件表空间的最大容量是相同的,但是在文件管理方面减少了对数据文件的管理工作。使用大文件表空间替代传统的表空间,数据库open checkpoint以及dbwr进程的性能会得到提高,但是增大数据文件的容量可能增加备份和恢复时间。System表空间是存储pl/sql程序结构,包括procedure function package trigger等,数据库打开后就必须将system