RAC gère plusieurs copies d'un même bloc, et alors?

C’est dommage, je n’ai pas relevé où j’ai lu ça: « RAC gère plusieurs copies du même bloc dans son cache global ! ». Bien sur et alors ? c’est vrai d’une instance non cluster aussi. Voici un exemple pour illustrer ce point:

show parameter cluster_database

NAME TYPE VALUE
-------------------------- ------- -----
cluster_database boolean FALSE
cluster_database_instances integer 1

create table t(c number)
tablespace users;

insert into t values (1);

commit;

select rowid, c
from t;

ROWID C
------------------ -
AAADKPAAEAAAAEGAAA 1

set serveroutput on

declare
v_rowid_type number;
v_object_number number;
v_relative_fno number;
v_block_number number;
v_row_number number;
v_rowid varchar2(30):='&rowid';
begin
dbms_rowid.rowid_info(v_rowid,
v_rowid_type,
v_object_number,
v_relative_fno,
v_block_number,
v_row_number);
dbms_output.put_line('RowID : '||v_rowid);
dbms_output.put_line('Type : '||v_rowid_type);
dbms_output.put_line('Object: '||v_object_number);
dbms_output.put_line('FNO : '||v_relative_fno);
dbms_output.put_line('Block : '||v_block_number);
dbms_output.put_line('RowNum: '||v_row_number);
end;
/

Enter value for rowid: AAADKPAAEAAAAEGAAA

RowID : AAADKPAAEAAAAEGAAA
Type : 1
Object: 12943
FNO : 4
Block : 262
RowNum: 0

update t set c=2;

select FILE#,BLOCK#,STATUS, DIRTY,DIRECT
from v$bh
where FILE#=4
and BLOCK#=262;

FILE# BLOCK# STATUS D D
----- ------ ------ - -
4 262 cr N N
4 262 xcur Y N

Mais vous vous dites peut-être que un bloc « consistent read » et un bloc « current » c’est logique? effectuer des modifications dans d’autres session ou manipulez « set transaction read only » et le hint « parallel » et vous obtiendrez bientot:

select FILE#,BLOCK#,STATUS, DIRTY,DIRECT
from v$bh
where FILE#=4
and BLOCK#=262;

FILE# BLOCK# STATUS D D
----- ------ ------ - -
4 262 cr N N
4 262 cr N N
4 262 xcur Y N

Bon… nettoyez:

drop table t purge;

FILE# BLOCK# STATUS D D
----- ------ ------ - -
4 262 free N N
4 262 free N N
4 262 free N N