Bonjour,
J'ai lu dans le livre de Thomas Kyte "Expert oracle Database Architecture" le fait que un nombre comme 1000000000 correspondait à 2 octets en "représentation interne Oracle" que l'on peut voir avec la fonction DUMP et pas à 10 comme je le pensais avec LENGTHB. Cela m'a intrigué et j'ai voulu comprendre un peu mieux ce concept en faisant des tests mais, pauvre de moi, j'y vois encore moins clair
J'ai créé deux tables avec les valeurs 1000000000 et 1999999999 en 100 000 exemplaires.
On voit que la fonction LENGTHB renvoit 10 octets mais VSIZE et DUMP ne renvoient que 2 octets si la valeur vaut 1000000000 et 6 pour la valeur 1999999999 --> sur le disque dur, il y a quoi, 10 octets ou bien 2 ou 6?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SQL> create table TEST(id01 NUMBER); Table created. SQL> insert into TEST (select 1000000000 FROM DUAL CONNECT BY LEVEL < 100001); 100000 rows created. SQL> commit; SQL> create table TEST02(ID02 NUMBER); Table created. SQL> insert into TEST02 (select 1999999999 FROM DUAL CONNECT BY LEVEL < 100001); 100000 rows created. SQL> commit;
Je regarde dans dba_segments et, surprise, je tombe sur 21 Ko par enregistrement, au lieu de 2 ou 6 ou 10, quelle que soit la valeur enregistrée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 SQL> select MAX(ID01),MIN(ID01), MIN(LENGTH(ID01)), MAX(LENGTH(ID01)), MIN(LENGTHB(ID01)), MAX(LENGTHB(ID01)), MIN(VSIZE(ID01)), MAX(VSIZE(ID01)) from TEST group by ID01; MAX(ID01) MIN(ID01) MIN(LENGTH(ID01)) MAX(LENGTH(ID01)) MIN(LENGTHB(ID01)) MAX(LENGTHB(ID01)) MIN(VSIZE(ID01)) MAX(VSIZE(ID01)) ---------- ---------- ----------------- ----------------- ------------------ ------------------ ---------------- ---------------- 1000000000 1000000000 10 10 10 10 2 2 SQL> select ID01, dump(ID01) from test where rownum = 1; ID01 DUMP(ID01) ---------- ------------------------------ 1000000000 Typ=2 Len=2: 197,11 SQL> select MAX(ID02),MIN(ID02), MIN(LENGTH(ID02)), MAX(LENGTH(ID02)), MIN(LENGTHB(ID02)), MAX(LENGTHB(ID02)), MIN(VSIZE(ID02)), MAX(VSIZE(ID02)) from TEST02 group by ID02; MAX(ID02) MIN(ID02) MIN(LENGTH(ID02)) MAX(LENGTH(ID02)) MIN(LENGTHB(ID02)) MAX(LENGTHB(ID02)) MIN(VSIZE(ID02)) MAX(VSIZE(ID02)) ---------- ---------- ----------------- ----------------- ------------------ ------------------ ---------------- ---------------- 1999999999 1999999999 10 10 10 10 6 6 SQL> select ID02, dump(ID02) from test02 where rownum = 1 ID02 DUMP(ID02) ---------- -------------------------------------------------- 1999999999 Typ=2 Len=6: 197,20,100,100,100,100
D'un côté ça me rassure de voir que chaque enregistrement a la même taille mais pourquoi 21 au lieu de 10 (chiffre renvoyé par LENGTHB)? Il y a le DATA block header, un pctfree de 10% par défaut mais cet écart est énorme, non?
Si vous pouviez éclairer ma lanterne, par avance merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 SQL> select sum(BYTES) from dba_segments where segment_name = 'TEST'; SUM(BYTES) ---------- 2097152 SQL> select sum(BYTES)/100000 from dba_segments where segment_name = 'TEST'; SUM(BYTES)/100000 ----------------- 20.97152 SQL> select sum(BYTES) from dba_segments where segment_name = 'TEST02' SUM(BYTES) ---------- 2097152 SQL> select sum(BYTES)/100000 from dba_segments where segment_name = 'TEST02' SUM(BYTES)/100000 ----------------- 20.97152
Partager