Ich habe ein Oracle-Schema mit über 70 Tabellen. Ich möchte eine einfache Seite erstellen, die den von den Tabellen belegten Festplattenspeicherplatz anzeigen kann. Wie kann ich diesen Wert mit einer SQL-Abfrage erhalten?
P.S .__ Und wie kann ich die Oracle-Architekturversion erhalten?
Du willst wahrscheinlich
SELECT sum(bytes)
FROM dba_segments
WHERE owner = <<owner of schema>>
Wenn Sie als Schemabesitzer angemeldet sind, können Sie dies auch tun
SELECT SUM(bytes)
FROM user_segments
Dadurch erhalten Sie den Speicherplatz, der den Objekten des Benutzers in den Tabellenbereichen zugewiesen ist, in denen sich der Benutzer befindet. Möglicherweise ist den Tabellen ein leerer Speicherplatz zugeordnet, der von diesen Abfragen als zugewiesen gilt.
Wenn Sie nur die Schemagröße ohne freien Speicherbereich und Indizes für den Tabellenbereich berechnen möchten:
select
sum(bytes)/1024/1024 as size_in_mega,
segment_type
from
dba_segments
where
owner='<schema's owner>'
group by
segment_type;
Für alle Schemata
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
Siehe z. http://www.dba-Oracle.com/t_script_Oracle_table_size.htm für weitere Optionen
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;``
Die obige Abfrage gibt Table_name, Row_count, Size_in_MB (einschließlich Lob-Spaltengröße) eines bestimmten Benutzers.
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;