11gR2 Exadata Hybrid Columnar Compression (aka EHCC) et VOS données

Si vous avez assisté à quelques unes des nombreuses présentations à propos d’Oracle 11g Release 2, vous avez sans doute entendu dire que vous pouvez compresser vos données avec des ratios de 10, 20 ou même 50 ! Votre Data Warehouse contient des tables de plusieurs centaines de Go, voire de plusieurs To; le retour sur investissement de cette fonctionnalité pourrait être instantanné dans votre cas et votre société économiserait alors plusieurs dizaines de k€ dès 2010, sans compter la promesse d’améliorer de manière drastique les temps de réponse de vos requêtes pour votre système décisionnel.

Seulement voilà, si la fourchette des taux de compression est si large, c’est que ces taux dépendent pour une bonne partie de vos données. La question pertinente est donc: « Combien pouvez-vous espérer de EHCC dans votre contexte? ». La réponse à cette question mérite bien quelques minutes de votre temps et c’est le sujet de cet article.

Echantillon de données

Pour répondre à cette question, échantillonnez vos données dans un système Oracle 11g Release 2 sur Linux x86 ou x86_64. Utilisez la méthode de votre choix: RMAN, DataPump, Database Link, un bon vieux export ou ce que vous voulez. Pour allez plus vite, n’hésitez pas à utilisez la clause SAMPLE des ordres SELECT comme discuté un de mes articles précédents.

DBMS_COMPRESSION

Oracle 11g Release 2 offre une procédure dans le package DBMS_COMPRESSION nommé GET_COMPRESSION_RATIO. Cette procédure réalise la compression dans un tablespace « scratch » pour en déduire la taille du segment compressé. Voici un exemple d’utilisation ci-dessous; je commence par créer une table X qui représente mon échantillon de données dans le schéma scott:

sqlplus / as sysdba

alter user scott identified by tiger;

grant dba to scott;

connect scott/tiger

create table X(text varchar2(4000)) tablespace users;

begin
for i in 1..100000 loop
insert into X values (rpad('X',1024));
end loop;
for i in 1..1000000 loop
insert into X values ('X');
end loop;
end;
/
commit;

Je peux ensuite lancer l’advisor:

set serveroutput on
declare
v_blkcnt_cmp BINARY_INTEGER;
v_blkcnt_uncmp BINARY_INTEGER;
v_row_cmp BINARY_INTEGER;
v_row_uncmp BINARY_INTEGER;
v_cmp_ratio NUMBER;
v_comptype_str varchar2(100);
begin
DBMS_COMPRESSION.GET_COMPRESSION_RATIO (
scratchtbsname => 'USERS',
ownname => user,
tabname => 'X',
partname => null,
comptype => dbms_compression.COMP_FOR_QUERY_HIGH,
blkcnt_cmp => v_blkcnt_cmp,
blkcnt_uncmp => v_blkcnt_uncmp,
row_cmp => v_row_cmp,
row_uncmp => v_row_uncmp,
cmp_ratio => v_cmp_ratio,
comptype_str => v_comptype_str);
dbms_output.put_line('taux de compression: '||to_char(v_cmp_ratio)||' '||v_comptype_str);
end;
/

Le résultat est très encourageant… si vous stockez toujours la même ligne ;-).

Compression Advisor self-check validation successful. select count(*) on both
Uncompressed and EHCC Compressed format = 1000001 rows
taux de compression: 238.6 "Compress For Query High"

Quelques ORA-

Il est possible que vous rencontriez quelques difficultés dans la mise en oeuvre de l’advisor; voici quelques unes de celles que j’ai pu expérimenter :

  • Si vous utilisez une version Oracle 11.2.0.1 sans patch, vous obtiendrez l’erreur ci-dessous; pour faire fonctionner l’advisor, installer le patch : 8896202: ENABLE COMPRESSION ADVISOR TO ESTIMATE EXADATA HCC COMPRESSION RATIOS
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "SYS.PRVT_COMPRESSION", line 461
ORA-64307: hybrid columnar compression is only supported in tablespaces
residing on Exadata storage
ORA-06512: at "SYS.DBMS_COMPRESSION", line 214
ORA-06512: at line 9
  • Pour utiliser l’advisor vous devez avoir au moins un millions de lignes dans votre table échantillon:
ERROR at line 1:
ORA-20000: Compression Advisor must have at least 1000000 rows in this
table/partition segment (segment has 102400 rows)
ORA-06512: at "SYS.PRVT_COMPRESSION", line 695
ORA-06512: at "SYS.DBMS_COMPRESSION", line 215
ORA-06512: at line 9
  • Enfin l’advisor ne fonctionne pas sous l’utilisateur SYS:
declare
*
ERROR at line 1:
ORA-12988: cannot drop column from table owned by SYS
ORA-06512: at "SYS.PRVT_COMPRESSION", line 695
ORA-06512: at "SYS.DBMS_COMPRESSION", line 215
ORA-06512: at line 9

Conclusion

Et voilà; il n’y a plus qu’à! Et vous qu’est-ce que vous obtenez ?