web-dev-qa-db-fra.com

Comment afficher la taille du schéma Oracle avec une requête SQL?

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?

15
Peter Penzov

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.

41
Justin Cave

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;
6
biology.info
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

4
Rostislav Matl
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. 

3
Bhaskar
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;
0
Dilip Paudel