跳跃索引测试
oracle 9I推出了跳跃索引index skip scan。刚好测试还算成功,一下都是针对oracle 10g的b+树索引T表的结构有两列x和y列,都是number类型X Y其中t表有41w数据,其中x有1和2两种取值,x=1的值有40w,x=2的值有1w,y则侯选值比较多,没有null列。创建联合索引Create index index_t on t(x,y)由于创建索引后oracle会自动执行分析索引,但是此时我们还需要对表做一个分析不然cbo的执行计划很有可能不准。调用dbms_stats系统包(oracle 8I后推荐使用dbms_stats收集统计信息,来代替使用analyze table t compute statistics, 不过这其中缘由暂时还
关于索引的执行计划记载
对于sql我们经常看见执行计划,刚好接触了资料自己就忍不住整理了一下。1 全表扫描 full table scans FTS全表扫描oracle需要读取表中所有行,然后检索合格条件的数据,而一次I/O读取数据块的多少则是由参数db_block_multiblock_read_count参数设定的,而不是只读取一个数据块,这极大的减少I/O总次数,提高系统吞吐量,一般全表扫描才使用多块读操作。当然大表的全表扫描是很消耗资源的,除非取出数据比较多,大概超过数据的总量的5%-10%,或者使用并行查询。(其中在cbo优化器下 索引利用与否oracle可以更好的判断,而经常能做的是索引长时
concept方案对象-01
方案定义:方案是一个逻辑数据结构集合,每个user都有一个同名的方案,方案对象就是方案下的对象,例如user用户的user方案的下的table,view等对象。方案schema和user区别不过有点区别的是创建一个user后,当前user下没有对象,此时并不存在此user的方案schema,方案诞生与user下的第一个对象的创建。行的格式容量:数据行片断:Oracle使用一个或多个行片断存储每一行数据。当一个数据块可以容纳一个数据行时(且表的列数小于256)此数据行就只用了一个数据行片断。当一个数据块无法容纳一条数据行时,oracle将使用多个行片断存储这一条数
where检索条件性能测试记载
清早起来打开ITPUB看到sql的执行计划适合和where后的条件有关系了,以前总是听说where后的条件是从右到左检索,所以需要把能排除大部分数据的检索条件放在最右边。参照PUB中的前辈的测试:Select 1 from dual where 1/0=1 and 1/2=1; 正常Select 1 from dual where 1/2=1 and 1/0=1; 报错这里自己有个测试思路:SQL> desc test01;Name Type Nullable Default Comments ---- ------------ -------- ------- -------- ID NUMBER Y NAME VARCHAR2(10) Y SQL> select * from test01 where name=sf and 1/0=1 and id=8;select * from tes
创建索引选项记载
索引可以说是oracle中比较重要但是又不容易彻底掌握的知识点。对于我们创建索引可能更多的就是一个很简单的语句create index index_name on table(id) tablespace index_tbs最近才了解到在创建索引时可以指定可选项让索引的创建适合业务的具体环境。1 NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值create index index_name on table(id) nosorttablespace index_tbs其实默认情况下,表中创建索引会对表中记录排序成功后再创建索引,其实索引的结构也可以更好的证明这点。如果记录比较多,肯定
ITL事务槽记载-01
前面有记载过关于块清除的blog,发现自己还是不太理解,又翻看了一些资料。还是要做一点别的知识的准备! 借鉴网络上的前辈的ITL记载,了解一下关于oracle中的ITL ITL:Interested transaction list也就是事务槽,记得oracle concept中第二篇关于数据块 扩展 段的介绍中就提到了数据块的结构:块头,表目录,行目录,数据行,可用空间区。 首先我们dump一个数据块吧 select file_id,block_id from dba_extents where segment_name='TT02' 4 2009 由于段空间自动管理中extent是用位图来管理block的使用 空闲信息的,所以这里我们选择第四块
with as 查询性能记载
With as短语也叫做子查询部分,定义一个sql片断,该sql片断会被整个sql语句所用到。With as 查询在有的时候,是为了让SQL语句的可读性更高些,有的时候也可以大幅提高sql的查询时间。对于sql中需要重复查询的表可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。with as查询特别对于UNION ALL比较
oracle concept-pga和共享sql 私有sql记载
看oracle concepts的第八章内存管理中对于pga和sql区真的不是很好理解,就把其中的要点难点摘要下来了,程序全局区pga是供服务进程存储数据及控制信息的内存区域。服务进程启动时由oracle创建的非共享的内存区。只有服务进程才能访问属于她的PGA,对pga的读写操作由oracle代码实现的。PGA的内容:每个用户都有自己的pga,记录各种不同的连接至oracle服务器的进程信息,例如用户名 密码等。登陆oracle的会话会在服务器端占用一块pga,会话刚登陆时,每个用户占用的pga大概几百KB内存,并在以后动态收缩。私有sql区中包含绑定信息及运行时内
rman_copy和基本命令记载
最近这两天终于在linux上装好了oracle 10g,折腾了好多次,有点像自己第一次用pl/sql连接数据库的时候,囧得很啊!不过其中的过程自己倒是对linux的文件目录和vi更加熟悉了。接下来还要配置一下rac和dg的环境,估计又得花一番功夫了!今天又看了eygle的循序渐进,重新翻看了rman的copy备份恢复,试试手了!首先修改一下system01.dbf的位置,方面后面测试Shutdown immediateStartup mount;Alter database rename file to ‘d:system01.dbf’;然后再os上复制数据文件1到的d:、是system.dbf位置Host rman target /Rman>backup as copy da
count(*)和count(1) count(primary key)的小测试
今天和网友一起讨论count(1) count(*) count(primary key)三个在性能上的优越性,测试结果区别不是很大,oracle 10G windows的生产库下,数据交换应该属于较小的。SQL> select count(*) from ycjhup.inf_apply_process; COUNT(*)---------- 191651已用时间: 00: 00: 00.42执行计划----------------------------------------------------------Plan hash value: 197964574-------------------------------------------------------------------------------------------| Id | Operation | Name
分区表和dbms_redefinition包在线重定义表
分区表很早就接触的一项技术手段。分区表虽然在逻辑上是同一张表,可是在数据库底层的segment确实多个对象,管理和维护可以只对分区表进行维护,采取将分区表存储在不同的表空间,表空间存储在不同的磁盘,改善了对表段的I/O。虽然自己所接触的生产库中并不存在分区表,但是一般超过了2Gb的表段就最好使用分区表,而且一些需要定期删除历史数据的表也可以采取分区表技术。range范围分区create table t10_partition(id number,edate date)partition by range(edate)(partition p1 values less than(to_date('2011-10-1','yyyy-mm-dd')) tab
rownum和rowid,row_number一点应用
很早之前就涉及到删除重复数据,下面的两个删除重复数据方法是自己经常用的,置于用一个新表来保留distinct *然后删除 rename等方法就不提了,因为生产库是不允许让表段invaid的。首先来张测试表吧Create table student(name varchar2(10),sc number)然后insert一系列数据。Select * from studentName sc3dd 56adf 45fda 80ffd 78dss 95cfe 74gds 92gf 99ddd 99adf 45asdf 553dd 56 一般生产库的表段是有主键约束的,但是也不排除有些接口表存在大量重复数据,此时需要alter table tablename add primary key(no),但是add主键时会检索我们
修改sga_target引起的ora-27100 bug吗
今天测试sga_target和sga_max_size参数。由于公司电脑是512M的内存,oracle数据库的sga和pga都设置的很小。 Show parameter sga_target显示sga_target=96M,由于此前也没有设置sga_max_size参数,默认的也是96M,Alter system set sga_target=120M scope=spfileAlter system set sga_max_size=100M scope=spfile然后重启数据库来验证sga_max_size的参数也会随着sga_target来改变。 Shutdown immediate;Startup;此时出现了ORA-27100: shared memory realm already exists共享内存领域已经存在,觉得是系统内存太小sga分配不了导致数据库无
asm-windows下安装asm
这些天终于弄好了关于windows上的asm安装,当前还需要接下来布置环境的还有在linux上的rac dg设置Asm的异步I/O性能和文件管理:Asm是oracle 10g推出自动存储管理,oracle提供的一个统一管理存储管理接口,asm主要提供了在异步I/O的性能和文件系统的管理。Asm是建立在裸设备上为oracle数据文件创建的‘特别文件系统’,这些文件系统全部由asm实例管理,oracle内核来管理和维护,跟os上维护管理不同,这些文件在os上是看不到的,全部由oracle内部管理维护。asm可以为多个数据库提供磁盘组来存储文件,可以选择系统中划分好的裸设备来组成asm磁
archivelog满了导致数据库怠机的solution
以前就遇到过archivelog满了,导致无法登陆数据库。今天自己在测试append直接插入和insert插入时不巧自己刚好又遇见了,ora-16038 ora-19809 ora-00312。Oracle数据库中有个闪回恢复区flash_recovery_area默认的是2G的大小,由于本机数据库是archivelog和flashback on同时开启了,产生的归档日志和闪回日志超过了2G容量的大小,也就导致无法归档,造成arch进程失败数据库而怠机了。首先flash_recovery_area满了导致sys用户也无法登陆数据库,此时肯定需要做的是先登陆数据库吧。于是手动在os上删除部分archivelog来腾出空间,但是此时数据
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,基于函数的索引才能生效,后续版本中基于函数的索引跟此参数已经无关,其中基于函数的