Bonjour,

J'utilise cette requête pour lister les tables occupant beaucoup plus d'espace que ce qu'elles devraient par rapport aux données qu'elles contiennent :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select 
    tab.owner, 
    tab.table_name, 
    tab.avg_row_len, 
    tab.num_rows, 
    round(((tab.blocks*tbs.block_size/1024/1024))) "TOTAL_SIZE (MB)", 
    round((tab.num_rows*tab.avg_row_len/1024/1024)) "ACTUAL_SIZE (MB)", 
    round(((tab.blocks*tbs.block_size/1024/1024)-(tab.num_rows*tab.avg_row_len/1024/1024))) "FRAGMENTED_SPACE (MB)", 
    decode(tab.blocks*tbs.block_size,0, null, round(((tab.blocks*tbs.block_size)-(tab.num_rows*tab.avg_row_len))/(tab.blocks*tbs.block_size)*100)) "%_VIDE" 
FROM 
    dba_tables tab, 
    dba_tablespaces tbs 
WHERE 
    tab.tablespace_name=tbs.tablespace_name
Et dans mes résultats, j'ai quelques tables qui occupent plusieurs dizaines de Go alors qu'elles ne contiennent que quelques centaines de Mo.
Et notamment celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
OWNER	TABLE_NAME	AVG_ROW_LEN	NUM_ROWS	TOTAL_SIZE (MB)	ACTUAL_SIZE (MB)	FRAGMENTED_SPACE (MB)	%_VIDE
DWH	TABLE1		66		42		53400		0			53400			100
Comment est-ce possible qu'une table ne contenant que quelques dizaines de lignes arrive à occuper 53Go ?
Sachant qu'elle a toujours à peu près le même nombre de lignes, elle est mise à jour en delete/insert très régulièrement.
J'avais compris qu'il était possible de perdre de l'espace libre à cause des suppressions qui créaient des 'trous' entre les données qui étaient perdus. Mais dans ce cas, j'ai du mal à comprendre qu'il ne réutilise pas l'espace disponible ?

Ou est-ce que je me suis loupé quelque part dans la requête ?

Par avance merci,
Nicolas