有时候,我们需要了解数据库的一些表所占用的磁盘空间有多大,虽然通过管理工具可以查看,但是只能一张表一张表的看,效率很慢。因此,可以通过以下方式,批量统计每张表所占用的表磁盘间是多大。
原方法更新:直接使用达梦数据库内置系统存储过程统计表行数和表大小
SELECT
B.OWNER,
B.TABLE_NAME,
ROUND(TABLE_USED_PAGES(B.OWNER,B.TABLE_NAME)*(PAGE/1024)/1024/1024,2) "GB",
TABLE_ROWCOUNT(B.OWNER,B.TABLE_NAME) "TABLE_ROWS"
FROM (
SELECT A.OWNER,
A.TABLE_NAME
FROM ALL_TABLES A
WHERE
A.TABLE_NAME NOT LIKE 'CTI%'
AND A.TABLE_NAME NOT LIKE 'SREF_CON_TAB%'
AND A.TABLE_NAME NOT LIKE 'BM%'
) B
ORDER BY 3 DESC,1,2;
旧思路:首先创建一张临时表,用来存储统计的表所占用磁盘空间数据信息。然后通过脚本计算出表所使用的空间,最后将计算结果批量插入到临时表中即可。
具体脚本如下:
--DROP TABLE TABLESIZE_COUNT;
--创建一张临时表,其中OWNER为模式名,TABLE_NAME为表名,TABLE_USED_PAGES为表使用的空间大小,单位为K,TABLE_USED_SPACE为表占用的空间大小,单位为K
CREATE TABLE TABLESIZE_COUNT (OWNER VARCHAR(100),TABLE_NAME VARCHAR(100),TABLE_USED_PAGES INTEGER,TABLE_USED_SPACE INTEGER);
DECLARE
V_OWNER VARCHAR2(100);
V_TABNAME VARCHAR2(100);
STMT1 VARCHAR2(200);
STMT2 VARCHAR2(200);
NUM_ROWS1 NUMBER;
NUM_ROWS2 NUMBER;
BEGIN
FOR REC IN
(
SELECT OWNER, TABLE_NAME FROM DBA_TABLES WHERE OWNER='HZQ' ORDER BY 1, 2
)
LOOP
SELECT REC.OWNER, REC.TABLE_NAME INTO V_OWNER, V_TABNAME FROM DUAL;
STMT1 := 'SELECT TABLE_USED_PAGES('''||V_OWNER||''','''||V_TABNAME||''')*(PAGE/1024)';
EXECUTE IMMEDIATE STMT1 INTO NUM_ROWS1;
EXECUTE IMMEDIATE 'INSERT INTO TABLESIZE_COUNT(OWNER,TABLE_NAME,TABLE_USED_PAGES) VALUES('''||V_OWNER||''','''||V_TABNAME||''','''||TO_NUMBER(NUM_ROWS1)||''');';
STMT2 := 'SELECT TABLE_USED_SPACE('''||V_OWNER||''','''||V_TABNAME||''')*(PAGE/1024)';
EXECUTE IMMEDIATE STMT2 INTO NUM_ROWS2;
EXECUTE IMMEDIATE 'UPDATE TABLESIZE_COUNT SET TABLE_USED_SPACE= '''||TO_NUMBER(NUM_ROWS2)||''' WHERE OWNER= '''||V_OWNER||''' AND TABLE_NAME = '''||V_TABNAME||''';';
COMMIT;
END LOOP;
END;
--TRUNCATE TABLE TABLESIZE_COUNT;
--SELECT COUNT(*) FROM TABLESIZE_COUNT;
SELECT OWNER,TABLE_NAME,TABLE_USED_PAGES "TABLE_USED_PAGES(KB)",TABLE_USED_SPACE "TABLE_USED_SPACE(KB)" FROM TABLESIZE_COUNT;
在脚本执行完成后,直接查看该表信息即可。
示例如下:
附:
使用DM管理工具查看表所使用的空间大小:
1.选择要查看的模式下的表
2.右键选择【属性】
3.在表属性对话框中即可查看到表所使用的空间