11G real time query,BUG不是一般的多

Sunday, September 6th, 2009

以前11G的主库对表做了truncate ,在备库查询这张表,有时候会遇到ORA-08103: object no longer exists ,需要激活standby或者打补丁才能解决
现在11.1.0.7上,也出现了一系列的关于ddl定义的BUG,
因为物理standby的redo apply是基于数据块级别的,他不像我们走正常的SQL调用,所以,主库做了DDL,会引起shared pool里面数据字典新的的一系列更新,而在备库上,redo只负责把datafile block刷新了,但shared pool里的内容,却没有刷新完全
 
–主库:
sys@CRMG>   desc b
 Name                                                                                Null?    Type
 ———————————————————————————– ——– ——————————————————–
 A                                                                                            DATE
 C 
 
–备库:
@>    desc b
 Name                                                                                Null?    Type
 ———————————————————————————– ——– ——————————————————–
 A                                                                                            DATE
 C                                                                                            DATE

–主库:
sys@CRMG>rename b to c;
Table renamed.
sys@CRMG>   desc c
 Name                                                                                Null?    Type
 ———————————————————————————– ——– ——————————————————–
 A                                                                                            DATE
 C 
 
sys@CRMG> insert into c select sysdate,sysdate from user_objects;
8606 rows created.
sys@CRMG>commit;
Commit complete.
 
–备库:
@>desc c;
 Name                                                                                Null?    Type
 ———————————————————————————– ——– ——————————————————–
 A                                                                                            DATE
 C                                                                                            DATE
@>desc b
 Name                                                                                [...]

11G real time query

Friday, July 3rd, 2009

11G standby提供了real time query的功能,通过这个功能,我们可以结合lgwr+async来做到实时standby查询,
给我们做读写分离提供了遐想空间,最近和老郑测试了下这个功能的实时性,希望对大家有所帮助
测试环境:
redhat linux as 4.7(64bit)
11.1.0.7.0 lgwr + async 20480 + real time query
主库:10组512M的联机日志
备库:11组512M的standby logfile
测试方法:
循环插入记录,为了增大日志量,起了6个进程,插入test1-test6
declare v_counter pls_integer := 0;
begin
        for i in 1..100000000 loop
                insert into $1 (id,mdate,mm) values(i,sysdate,’wo shi ni ba’);
                v_counter := v_counter + 1;
                if v_counter = 10 then
                        commit;
                        v_counter := 0;
                end if;
        end loop;
end;
/
以表test1为参考,每隔1秒查询主库和备库的最大ID,还有插入的时间,如果是完全实时,这两个数值应该相等,
通过两边的max(id)和maxid对应的时间,可以看出real time query的延迟,采样结果保存于rquery_time表
测试的日志量大家可以自己加压设置,本次测试日志量是37M/S,让我有点吃惊,但多次statspack统计的结果和日志切换的频率计算,
就是如此
Load Profile              Per [...]

oracle count计数的优化

Wednesday, May 13th, 2009

       在9i,我们知道count(*)的时候,如果表上有pk,那count(*) 一定会走pk的。count(column) ,如果column指定not null,那count(column)  可以走上索引(通过试验证明,必须还要加上index提示才能走上索引)。但如果列上有空值,不管如何加提示,都走不上列上的索引(组合索引的非引导列除外)
       count是否应该走索引,主要取决于count是否应该把空值算进来。所以, count(column) ,不管字段是否有null,都可以走索引。进而我们可以推论,如果表上存在一not null的字段,而且这个字段上有索引,表上即使没有pk,count(*)也可以通过扫描整个索引完成计数。在11g里面,oracle改进了策略。测试如下:

>create table test (col1 varchar2(32),col2 varchar2(32));
Table created
>insert into test
2 select id,member_id
3 from b where rownum<=10;
>select * from test;
COL1 COL2
——————————– ——————————–
477234 shenzhenxiechang
291004 shenzhoutouzi
345045 hgyingzi
212170 ntdongyi
493284 ntfashion
200282 rebecca123
1199257 szjinshuipos
629740 nttg
1512060 rich228
772466 nxyk
>create index col_ind on test (col1);
>create index co2_ind on test (col2);
Index created.
Index created.
>select count(col1) from test;
COUNT(COL1)
———–
10
1 row selected.
Execution Plan
———————————————————-
Plan [...]

阿里巴巴DBA出品