70以上のテーブルを持つOracleスキーマがあります。テーブルが占有するHDDスペースを表示できるシンプルなページを作成したい。 SQLクエリでこの値を取得するにはどうすればよいですか?
P.Sそして、どのようにOracleアーキテクチャバージョンを入手できますか?
あなたはおそらく欲しい
SELECT sum(bytes)
FROM dba_segments
WHERE owner = <<owner of schema>>
スキーマ所有者としてログインしている場合は、次のこともできます。
SELECT SUM(bytes)
FROM user_segments
これにより、ユーザーが所有するオブジェクトに割り当てられたスペースが、どのテーブルスペースにあるかがわかります。これらのクエリによって割り当てられたものとしてカウントされるテーブルに割り当てられた空のスペースがある場合があります。
テーブルスペースの空き領域とインデックスなしでスキーマサイズを計算したいだけの場合:
select
sum(bytes)/1024/1024 as size_in_mega,
segment_type
from
dba_segments
where
owner='<schema's owner>'
group by
segment_type;
すべてのスキーマ用
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
例参照 http://www.dba-Oracle.com/t_script_Oracle_table_size.htm その他のオプション
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;``
上記のクエリは、特定のユーザーのTable_name、Row_count、Size_in_MB(lob列サイズを含む)を提供します。
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;