Mysql Oracle DM数据库统计表数据量和条数
1、一、MYSQL:
select TABLE_SCHEMA, TABLE_NAME,CONCAT(round(DATA_LENGTH/1024/1024,2) ,'MB')as TABLE_VOLUME,TABLE_ROWS
from information_schema.tables
where TABLE_TYPE='BASE TABLE'
2、二、oracle:
如果不含大字段 直接user_tables /dba_tables ,如果有大字段使用user_segments /dba_segments
通过块数计算数据量:to_char(round(s.blocks*8/1024,2),'fm990.0099')||'MB' ,可能不准,block大小可能会变
data block :oracle 11g 标准块:8k,支持2-32k,有block header 、free space 、data 组成
-- 如果是分区表, segment_type = 'TABLE PARTITION'
通过字节数计算数据量:to_char(round(s.BYTES /1024/1024.0,2),'fm99999999990.00')
select t.owner TABLE_SCHEMA,TABLE_NAME, num_rows||'' TABLE_ROWS, to_char(round(s.BYTES /1024/1024.0,2),'fm99999999990.00') TABLE_VOLUME
from dba_tables t
left join dba_segments s
on t.table_name=s.segment_name
where s.segment_type like 'TABLE%'
3、三、DM(达梦数据库):
1、首先使用存储过程执行特定用户的表统计行数,否则NUM_ROWS为null
DBMS_STATS.GATHER_SCHEMA_STATS('ROOT',100,TRUE,'FOR ALL TABLE NUM_ROWS AUTO');
2、使用和oracle一样的sql统计行数和数据量
select t.owner TABLE_SCHEMA,TABLE_NAME, num_rows||'' TABLE_ROWS,
to_char(round(s.BYTES /1024/1024.0,2),'fm99999999990.00') TABLE_VOLUME
from dba_tables t
left join dba_segments s
on t.table_name=s.segment_name
where s.segment_type like 'TABLE%' and t.owner='ROOT'
3、通过内置函数获取表数据量
select
to_char(TABLE_USED_PAGES(t.owner,TABLE_NAME)*to_number(page())/1024/1024.0,'fm99999999990.00')||'MB',
--TABLE_USED_SPACE占用页的数目 要用to_number(page())否则有可能会报数据溢出
to_char(TABLE_USED_PAGES(t.owner,TABLE_NAME)*to_number(page())/1024/1024.0,'fm99999999990.00')||'MB'
--TABLE_USED_PAGES实际使用页的数目
from dual; --M为单位
select t.owner TABLE_SCHEMA,TABLE_NAME,
TABLE_USED_PAGES(t.owner,TABLE_NAME)*to_number(page())/1024/1024.0||'MB' SJ_TABLE_VOLUME ,
--实际占用空间MB
to_char(round(s.BYTES /1024/1024.0,2),'fm990.00')||'MB' TABLE_VOLUME
--占用空间MB
from dba_tables t
left join dba_segments s on t.table_name=s.segment_name
where s.segment_type like 'TABLE%' and t.owner='ROOT'
4、通过自定义函数获取表的记录数
创建获取表记录数的函数
CREATE OR REPLACE FUNCTION ROOT.GET_TABLE_COUNT
(SCHEMA_NAME IN VARCHAR(50),TABLE_NAME IN VARCHAR(50))
RETURN INT
AS
NUM_ROWS INT;
V_SQL VARCHAR2(300);
BEGIN
V_SQL := 'select count(*) from '||SCHEMA_NAME||'.'||TABLE_NAME;
EXECUTE IMMEDIATE V_SQL INTO NUM_ROWS;
RETURN NUM_ROWS;
END;
使用函数获取num_rows,注意用户可能没有使用TABLE_SCHEMA的权限,部分系统内置
select t.owner TABLE_SCHEMA,TABLE_NAME, ROOT.GET_TABLE_COUNT(t.owner,TABLE_NAME) TABLE_ROWS ,
--自定义函数ROOT.GET_TABLE_COUNT
to_char(round(s.BYTES /1024/1024.0,2),'fm990.00')||'MB' TABLE_VOLUME
--占用空间MB
from dba_tables t
left join dba_segments s on t.table_name=s.segment_name
where s.segment_type like 'TABLE%'