J'ai un schéma Oracle avec plus de 70 tables. Je veux créer une page simple pouvant afficher l'espace disque dur occupé par les tables. Comment puis-je obtenir cette valeur avec une requête SQL?
P.S Et comment puis-je obtenir la version d'architecture Oracle?
Vous voulez probablement
SELECT sum(bytes)
FROM dba_segments
WHERE owner = <<owner of schema>>
Si vous êtes connecté en tant que propriétaire du schéma, vous pouvez également
SELECT SUM(bytes)
FROM user_segments
Cela vous donnera l'espace alloué aux objets appartenant à l'utilisateur dans les tablespaces dans lesquels ils se trouvent. Il peut y avoir un espace vide alloué aux tables compté comme alloué par ces requêtes.
Si vous souhaitez simplement calculer la taille du schéma sans espace libre ni espace de tablespace:
select
sum(bytes)/1024/1024 as size_in_mega,
segment_type
from
dba_segments
where
owner='<schema's owner>'
group by
segment_type;
Pour tous les schémas
select
sum(bytes)/1024/1024 as size_in_mega, owner
from
dba_segments
group by
owner;
select T.TABLE_NAME, T.TABLESPACE_NAME, t.avg_row_len*t.num_rows from dba_tables t
order by T.TABLE_NAME asc
Voir par exemple http://www.dba-Oracle.com/t_script_Oracle_table_size.htm pour plus d'options
SELECT table_name as Table_Name, row_cnt as Row_Count, SUM(mb) as Size_MB
FROM
(SELECT in_tbl.table_name, to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from ' ||ut.table_name)),'/ROWSET/ROW/C')) AS row_cnt , mb
FROM
(SELECT CASE WHEN lob_tables IS NULL THEN table_name WHEN lob_tables IS NOT NULL THEN lob_tables END AS table_name , mb
FROM (SELECT ul.table_name AS lob_tables, us.segment_name AS table_name , us.bytes/1024/1024 MB FROM user_segments us
LEFT JOIN user_lobs ul ON us.segment_name = ul.segment_name ) ) in_tbl INNER JOIN user_tables ut ON in_tbl.table_name = ut.table_name ) GROUP BY table_name, row_cnt ORDER BY 3 DESC;``
La requête ci-dessus donnera, Table_name, Row_count, Size_in_MB (inclut la taille de la colonne lob) d'un utilisateur spécifique.
SELECT DS.TABLESPACE_NAME, SEGMENT_NAME, ROUND(SUM(DS.BYTES) / (1024 * 1024)) AS MB
FROM DBA_SEGMENTS DS
WHERE SEGMENT_NAME IN (SELECT TABLE_NAME FROM DBA_TABLES) AND SEGMENT_NAME='YOUR_TABLE_NAME'
GROUP BY DS.TABLESPACE_NAME, SEGMENT_NAME;