找出表空间中每个表的大小?

时间:2011-02-07 11:31:32

标签: oracle10g

我想在oracle 10g

中找出特定表空间中所有表的大小

O / P应指定每个当前占用的大小 表。如果表中有任何内容,它应该包括blob字段的大小, 如果在该表上,它还应该包括任何索引的大小。

我目前正在使用此查询,但它不包含索引的大小,也不确定这是否包含blob大小。

select TABLE_NAME, ROUND((AVG_ROW_LEN * NUM_ROWS / 1024), 2) ROW_SIZE_KB, (BLOCKS * 8)  BLOCK_SIZE_KB  
from USER_TABLES  
order by TABLE_NAME

建议..

如果有人可以编写一些查询来表示表中每个字段的大小,还有表的总大小和表中每个索引的大小,那将会很棒。

编辑: 我真正想要的是:我想知道表所消耗的实际空间,我的数据实际消耗的空间。不是空的空间。如果有任何索引,那么索引的大小,而不是oracle为将来使用而保留的额外字节。

动机: 我已经使用SSMA将一些数据库从oracle移动到SqlServer 2008。我面临的问题是数据库的大小已经从80GB(在oracle中)减少到20GB(在SqlServer中)。我使用了这个查询:

SELECT
  /* + RULE */
  df.tablespace_name "Tablespace",
  df.bytes / (1024*1024*1024) "Size(GB)",
  SUM(fs.bytes) / (1024*1024*1024) "Free(GB)",
  NVL(ROUND(SUM(fs.bytes) * 100 / df.bytes),1) "%Free",
  ROUND((df.bytes         - SUM(fs.bytes)) * 100 / df.bytes) "%Used"
FROM dba_free_space fs,
  (SELECT tablespace_name,
    SUM(bytes) bytes
  FROM dba_data_files
  WHERE tablespace_name not like 'SCN%'
  GROUP BY tablespace_name
  ) df
WHERE fs.tablespace_name (+) = df.tablespace_name 
GROUP BY df.tablespace_name, df.bytes
order by 3 desc

现在,我想要做的是,由于存在这种减少,我想到了比较表空间下表中的数据。这就是问题的原因。

3 个答案:

答案 0 :(得分:3)

获取总分配空间。

select bytes from user_segments where segment_name = 'TABLE_NAME';

重复每个索引。这将为您提供分配的空间,包括为将来插入和更新保留的空间。

答案 1 :(得分:0)

vsize函数返回大多数列的内部表示中的字节数。 DBMS_LOB.GETLENGTH返回lob的字节数或字符数。

select vsize(not_a_lob_col), DBMS_LOB.GETLENGTH(a_lob_col) from a_table;

“Oracle数据库应用程序开发人员指南 - 大对象”指南提供了有关DBMS_LOB包的更多信息。

这两个函数都没有包含每列开销的字节(大变量3的字节)。

答案 2 :(得分:-1)

检查索引和表的大小

选择substr(segment_name,1,30)segment_name,bytes / 1024/1024“Size in MB”     来自user_segments     其中segment_name('TABLE_NAME');

Arvind Kumar