redo log日志挖掘(二)
这一段时间,在上次的基础上,完成了行迁移、行链接的支持,并且增加了rollback的支持。在数据类型方面,增加了char和timestamp的支持,请看测试:SUNDOG315>create table t (id1 number,id2 number,id3 number,text1 varchar2(4000),text2 varchar2(4000),text3 varchar2(4000));表已创建。SUNDOG315>insert into t values (1,2,3,lpad('a',4000,'a'),lpad('a',4000,'a'),lpad('a',4000,'a'));已创建 1 行。SUNDOG315>insert into t values (2,3,4,'a','a','a');已创建 1 行。SUNDOG315>update t set text1=lpad('a',4000,'a
慎用sys_context,可能导致无法正确的bind_peeking,而选择错误的执行计划
http://www.itpub.net/thread-1350771-1-1.html在上面的帖子里,楼主提出使用dbms_session来处理绑定变量。但是,这个方法必须进行有效的测试,防止出现错误的执行计划。由于sys_context导致bind_peeking无法正确执行,在某些情况下,会生成错误的执行计划,见下例:[@more@]SQL*Plus: Release 11.2.0.1.0 Production on 星期三 9月 29 08:43:56 2010Copyright (c) 1982, 2010, Oracle. All rights reserved.SUNDOG315>conn test/test已连接。SUNDOG315>create table t (id number,text varchar2(4000));表已创建。SUNDOG315>in
为什么要有列的统计信息
http://www.itpub.net/thread-1349832-1-1.html在这个帖子中,楼主发现了一个问题begin dbms_stats.gather_table_stats(ownname => 'SCOTT', tabname => 'T5', METHOD_OPT => 'FOR COLUMNS SIZE AUTO');end;即使不指定列名或ALL,依然可以成功执行但是,这样执行是不会收集列上的统计信息的,见下面的测试例子:[@more@]列的统计信息还包含NDV等信息,在CBO情况下,如果不开动态采样,并且没有列的统计信息,则列的选择度会采用默认选择度,这样,有可能
Bug 9369183 - ORA-32349 creating MView on prebuilt table using select from remote table
遭遇bug9369183,无法建立与远程表同名的prebuilt table物化视图但是,文档中记录此BUG在11.2.0.2解决,但实际上,在我的测试环境下,即使11.1都没有此问题记录一下,附加该BUG的具体信息:[@more@]Bug 9369183: MVIEW WITH PREBUILT TABLE ON SELECT FROM REMOTE TABLE RETURNS ORA-32349Bug 属性类型B - Defect已在产品版本中修复12.1严重性2 - Severe Loss of Service产品版本11.2.0.1状态80 - Development to Q/A平台46 - Linux x86创建时间10-Feb-2010平台版本NO DATA更新时间30-Jul-2010基本 Bug6815375 数据库版本11.2.0.1影响平台
redo log日志挖掘(一)
从2010年7月开始,公司准备上一个增量ETL工具,领导安排研究一下Oracle 的 redo log 格式,如果可以的话,可以做程序来挖掘,并且生成可执行的SQL,传递到目标环境中应用。各个工作从2010年7月23日开始,到今天,已经2个多月了,中间夹杂了一些事情,导致进展不是很快。现在,读取、解析的工作已经可以拿来见人了:)Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Connected as testSQL> insert into t select * from dba_objects where rownum<100;99 rows
hp-ux内存不足导致交换一例
客户反映一台32G的HP-UX经常swap,但,分给Oracle的SGA+PGA内存仅仅23个G,并且,该机器上没有跑其他的应用,理论上不应该导致交换。glance了一下:发现FileCache占用了8.3Gb的内存,导致了内存交换。对于HP-UX 11i Version 3,可以修改初始化参数filecache_max来控制FileCache占总内存的百分比http://docs.hp.com/en/B2355-60130/filecache_max.5.html[@more@]NAMEfilecache_max, filecache_min — maximum or minimum amount of physical memory used for caching file I/O dataVALUESFailsafefilecache_min: approximately 5% of physi
索引无法消除排序的问题
原帖见:http://www.itpub.net/viewthread.php?tid=1345402由于对索引键进行了reverse,导致无法避免排序。其实,在不加hint无法走index full scan就可以发现问题了。最后绕了一大圈。记录一下。[@more@]
V$SYSMETRIC_HISTORY 的时间错乱
记录一下:http://www.itpub.net/thread-1339001-1-1.htmlBug 5880921 - Time inconsistency between V$SYSMETRIC_HISTORY and SYSDATE [ID 5880921.8] -------------------------------------------------------------------------------- 修改时间 03-APR-2009 类型 PATCH 状态 PUBLISHED Bug 5880921 Time inconsistency between V$SYSMETRIC_HISTORY and SYSDATEThis note gives a brief overview of bug 5880921. The content was last updated on: 03-APR-2009Click here for details of each of the sections below.
统计信息的32位限制
原帖在此:http://www.itpub.net/thread-1339053-1-1.htmlOracle在对于varchar等字符型字段收集统计信息时,并不会对每个值都进行精确的统计,而是,对值进行substr(,32)。一般来讲,这种方式没有什么问题,但是,如果恰巧列中存储的数据,前32bytes相同,那么,Oracle的统计就会与实际情况不符。请看下面的例子:[@more@]SQL*Plus: Release 11.2.0.1.0 Production on 星期五 8月 20 10:40:54 2010Copyright (c) 1982, 2010, Oracle. All rights reserved.SQL> conn test/test已连接。SQL> drop table t;表已删除。SQL> create
关于delete还是update会产生更多日志的问题
论坛上有兄弟问http://www.itpub.net/thread-1338094-1-1.html对于redo而言,不仅仅需要记录数据块的更改,还需要记录相关undo的信息。因此,由于delete操作需要记录全部列的undo信息,redo量往往大于update。但是,考虑到supplemental log(附加日志)时,是什么情况呢?[@more@]SQL> select SUPPLEMENTAL_LOG_DATA_MIN, 2 SUPPLEMENTAL_LOG_DATA_PK, 3 SUPPLEMENTAL_LOG_DATA_UI, 4 SUPPLEMENTAL_LOG_DATA_ALL 5 from v$database 6 ;SUPPLEME SUP SUP SUP-------- --- --- ---YES YES YES NOS
INDEX RANGE SCAN DESCENDING的逻辑读问题
itpub:http://www.itpub.net/thread-1335784-1-1.htmlINDEX RANGE SCAN DESCENDING的逻辑读126明显大于INDEX RANGE SCAN 5,但优化器依然选择了INDEX RANGE SCAN DESCENDING这里先不讨论优化器的选择,仅仅看看是否INDEX RANGE SCAN DESCENDING的逻辑读会高的这么厉害下面是测试代码:[@more@]SQL> create table emp (id,name) as select object_id,object_name from dba_objects;表已创建。SQL> create index t_idx_emp on emp(id);索引已创建。SQL> set arraysize 5000SQL> select id,name from emp where id between 100 a
日期转换为raw的函数
在论坛上看到有需要日期转raw的兄弟,写了个函数:create or replace function date_to_raw(rv varchar2) return varchar2as rv_century number; rv_year number; rv_month number; rv_day number; rv_hour number; rv_mil number; rv_sec number;begin rv_century:=to_number(substr(rv,1,2))+100; rv_year:=to_number(substr(rv,3,2))+100; rv_month:=to_number(substr(rv,5,2)); rv_day:=to_number(substr(rv,7,2)); rv_hour:=to_number(substr(rv,9,2))+1; rv_mil:=to_number(substr(rv,11,2))+1; rv_sec:=to_number(s
11G Adaptive Cursor Sharing(ACS)自适应游标测试
被10G变量窥视搞得很头痛,看看11G的ACS新特性。SQL*Plus: Release 11.2.0.1.0 Production on 星期四 7月 8 14:18:36 2010Copyright (c) 1982, 2010, Oracle. All rights reserved.SQL> conn test/test已连接。SQL> create table t(id integer,text varchar2(4000));表已创建。SQL> insert into t select 1,object_name from dba_objects;已创建63861行。SQL> insert into t values(2,'aaa');已创建 1 行。SQL> insert into t select 3,object_name from dba_objects where rownum<10000;已创建9999行。SQL> commit
伪造基于ASSM表空间的数据块
从底向上第一篇--了解DML操作从底向上第二篇--了解行迁移从底向上第三篇--了解index的compress从底向上第四篇--了解行链接从底向上第五篇--了解表的压缩属性从底向上第六篇--compress for oltp真正压缩的阈值触发条件从底向上第七篇--超255列表的存储从底向上第八篇--伪造基于ASSM表空间的数据块突发奇想,既然Oracle数据块的格式我们基本都能了解,那么,伪造一个数据块也应该是可行的,做个实验,测试一下SQL> conn test/test已连接。SQL> create table t as select * from dba_objects where rownum=1;表已创建。SQL> select
ASSM表空间FIRST LEVEL BITMAP BLOCK位图标志位意义
offset 3961 FULL2 0-25% free3 25-50% free4 50-75% free5 75-100% free6 Shrink Complete[@more@]
看到unwrap的,咱也做个自动wrap当前用户的procedurefunctionpackage脚本
看到unwrap的,咱也做个自动wrap当前用户的procedurefunctionpackage脚本原先都是用wrap命令行来打包代码,但是,这个工具有版本的限制,如果高版本的wrap想刷到低版本的服务器里就会有问题。头疼了很久了。现在写了个存储过程脚本,可以在服务器端自动wrap没有wrap的代码。嘿嘿。只用把源码刷进去,执行,就可以了。当然,也可以改成wrap指定的过程、函数、包。http://www.itpub.net/viewthread.php?tid=1209011[@more@]
从底向上第六篇--compress for oltp真正压缩的阈值触发条件
从底向上第一篇--了解DML操作 从底向上第二篇--了解行迁移 从 底向上第三篇--了解index的compress 从 底向上第四篇--了解行链接 从 底向上第五篇--了解表的压缩属性 从 底向上第六篇--compress for oltp真正压缩的阈值触发条件 在Oracle 11.2里,新增加了compress for oltp压缩方式,Oracle声称这种方式是专为OLTP系统定制的,其原理图如下: Oracle has put in a significant amount of work to minimize this overhead for OLTP Table Compression. Oracle compresses blocks in batch mode rather than compressin
segment createion deferred
问题来源于一次导出C:UsersAdministrator>exp acms/acms tables=acms_light_time file=aaa.dmpExport: Release 11.2.0.1.0 - Production on 星期五 5月 28 13:44:06 2010Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning option已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集即将导出指定的表通过常规路径...EXP-00011: ACMS.ACMS_LIGHT_TIME 不存在导出成功终止, 但出现警告。C:UsersAdminist
Index扫描生成返回记录的处理流程到底是什么
Branch Block->Leaf Block->Data Block这个流程是索引扫描的流程。 现在的问题是,对于一个索引扫描的执行计划,TABLE ACCESS BY INDEX ROWID到底意味着什么? 1.直接返回Data Block相关rowid的行,索引存在的意义仅为定位记录 2.读取Data Block相关rowid行的记录,并在索引的基础上补全记录,索引列的数据不是真正Data Block相对列的数据 [@more@]C:UsersAdministrator>sqlplus /nologSQL*Plus: Release 11.2.0.1.0 Production on 星期三 5月 19 10:16:41 2010Copyright (c) 1982, 2010, Oracle. All rights reserved.SQL> c
从底向上第四篇--了解行链接
从底向上第一篇--了解DML操作从底向上第二篇--了解行迁移从底向上第三篇--了解index的compress从底向上第四篇--了解行链接从底向上第五篇--了解表的压缩属性在从底向上系列的第二篇,从底向上了解行迁移时我们看到了行迁移的产生,以及oracle是如何在block里处理行迁移。行迁移、行链接是两个概念,但是很多人可能都不太了解两者的区别与相同的地方。我们这里就加以引申,来看看行链接的情况。SQL> create table t (a varchar2(4000),b varchar2(4000),c varchar2(4000)); --这里我们建一个3个列的表表已创建。SQL> insert into t v