性能调整篇01
最近在看某某大牛的性能调整篇,结合个人理解和熟悉陆续会整理一系列的性能调整方面的理解。接触oracle大半年了,32位oracle和64位oracle,最近才摸清这缘由。32位系统肯定只能安装32位的oracle,不过32位的oracle使用的内存有限(大概只有1.7G),就是即使再多的物理内存也没办法真正使用,这在大型数据库中的性能扩展可想而知。64位系统安装了64位oracle,oracle使用的内存也没有上限,所以企业一般都是64位的吧!锁定内存到物理内存sga_lock:说到了内存,这些天看oracle-concepts有个参数sga_lock的主要适用于锁定oracle所使用的内存存
可传输表空间记载
今天泡pub看到一个网友说到跨平台迁移表空间,把a库的表空间迁移到b库中,往常的可以通过exp和imp或者数据磊工具导入导出,记得在oracle concepts中提到了关于可传输表空间的功能,在oracle 10G中可以跨平台迁移。这里假设a库是源库,b库是目标库select a.platform_name,b.endian_format from v$database a,v$transportable_platform bwhere a.platform_name=b.platform_nameplatform_name endian_format分别在a库和b库这里主要是查看数据库所在的服务器的os上的信息。在oracle 10g的视图Select platform_id,platform_name,endian_forma
profile资源限制基础记载
Profile资源限制Show parameter resource_limit.默认在数据库中resource_limited=false限制了资源限制Alter system set resource_limit=true开启资源限制。一般create profile命令Create profile test01_profile limitSessions_per_user 4 –user并行的最大连接数,当超过这个并行连接数时会出现ORA-02391 exceeded simultaneous SESSIONS_PER_USER limitConnect_time 60 –一个连接session的最长连接时间,超过后会断开,回滚当前事务,单位为分钟。Idle_time 10—一个连接session的最长空闲时间,当超过idle_time时会断开,回滚当前事务
直接加载和并行-02
还是继上次说说并行parallel,首先并行原理是:oracle创建一个进程用于协调并行服务进程之间的信息和任务分配,把一个任务分割成很多小任务分配给并行服务进程,并行进程同时处理各自分配任务,直到任务全部结束,最后协调进程负责将各进程任务合并为最终执行结果返回给用户。并行在OLAP用的比较多,OLAP系统表一般为大表,OLTP上的表很多都以索引访问为主,不过一切都要看实际业务情况,一般如果有多cpu,操作的对象很大开启并行是可以明显提高效率的。一个查询的parallelAlter table tt01 parallel 2;SQL> select count(*) from tt01
直接加载和并行记载-01
不久之前记得做过几个测试关于nologging和append的产生redo的。看并行和直接加载刚好有点需要记载的地方就贴blog上了。直接路径加载将直接绕过buffer cache将数据直接写入磁盘。而且会把数据写入HWM以上的数据块中,所以一般直接路径加载速度上可能比常规加载快。直接路径加载既可以并行 也可以串行,对分区表和普通表都可以。Insert /*+append*/ into tt07 select * from dba_objects当然如果是insert into …values单条插入方式,oracle10G中没有此项功能,网友说到在11G中可以insert /*+append_values*/ into tt07 values( ),不过个人没
跳跃索引测试
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来腾出空间,但是此时数据