Fragmentation espace libre d'une table à 100%
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:
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:
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