多语言展示
当前在线:1332今日阅读:19今日分享:20

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_VOLUMEfrom dba_tables  tleft join dba_segments son t.table_name=s.segment_namewhere s.segment_type like 'TABLE%'

3

三、DM(达梦数据库):1、首先使用存储过程执行特定用户的表统计行数,否则NUM_ROWS为nullDBMS_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  tleft join dba_segments s on t.table_name=s.segment_namewhere 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 ,  --实际占用空间MBto_char(round(s.BYTES /1024/1024.0,2),'fm990.00')||'MB' TABLE_VOLUME--占用空间MBfrom dba_tables  tleft join dba_segments s on t.table_name=s.segment_namewhere 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 INTAS 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_COUNTto_char(round(s.BYTES /1024/1024.0,2),'fm990.00')||'MB' TABLE_VOLUME--占用空间MBfrom dba_tables  tleft join dba_segments s on t.table_name=s.segment_namewhere s.segment_type like 'TABLE%'

注意事项
1

oracle通过块数计算数据量可能不准确,块大小可以人为改变

2

oracle的块blocks*8可能超出整型表示的最大范围,用to_number(blocks*8)处理

3

达梦使用存储过程执行特定用户的表统计行数,再使用num_rows

4

达梦注意用户可能没有使用TABLE_SCHEMA的权限,部分系统内置模式不在列表范围

推荐信息