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 :
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.
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 notamment celle-ci :
Comment est-ce possible qu'une table ne contenant que quelques dizaines de lignes arrive à occuper 53Go ?
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
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
Partager