oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示,统计clob、blob字段占用空间大小
oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示,统计clob、blob字段占用空间大小
oracle 查询指定用户下每个表占用空间的大小,倒序显示
使用场景:数据分析;导出医院正式库到开发环境时,查询出占用表空间高的业务表、导出时排除该表
在Oracle数据库中,要查询指定用户下每个表占用空间的大小并以倒序显示,可以使用数据字典视图DBA_SEGMENTS(或ALL_SEGMENTS,如果你有权限访问这些视图),结合DBA_TABLES(或ALL_TABLES)来获取相关信息。下面是如何实现这一查询的步骤:
说明:SUM(s.bytes) / 1024 / 1024 AS space_used_mb 这部分计算了总字节数并转换为MB(兆字节),以便更直观地显示空间使用量。
1. 使用DBA_SEGMENTS和DBA_TABLES
如果你有DBA权限,可以使用DBA_SEGMENTS和DBA_TABLES视图。这将提供该oracle实例下每个表的空间使用情况,但请注意,你需要有相应的权限。
SELECT
t.owner,
t.table_name,
SUM(s.bytes) / 1024 / 1024 AS space_used_mb
FROM
dba_segments s
JOIN
dba_tables t ON s.owner = t.owner AND s.segment_name = t.table_name
WHERE
s.segment_type = 'TABLE'
AND t.owner = 'C##BBP402CYTJDEV41' -- 替换为你的用户名
-- and t.owner in('C##BBP402CYTJDEV41','C##AUDIT_USER') --或者使用in查询多个用户、如果不带owner查询条件、则查询实例下所有表占用空间
GROUP BY
t.owner, t.table_name
ORDER BY
space_used_mb DESC;
2. 使用USER_SEGMENTS和USER_TABLES(仅限当前用户)
如果你只想查看当前用户(schema)下的表空间使用情况,可以使用USER_SEGMENTS和USER_TABLES视图。
SELECT
t.table_name,
SUM(s.bytes) / 1024 / 1024 AS space_used_mb
FROM
user_segments s
JOIN
user_tables t ON s.segment_name = t.table_name
WHERE
s.segment_type = 'TABLE'
GROUP BY
t.table_name
ORDER BY
space_used_mb DESC;
3.blob、clob字段单独统计占用空间
blob、clob等二进制无法统计
如TJ_PHOTO_SFZH 表clob字段保持的图片的base64编码,上述sql统计的0.0625MB数据是不包含clob字段的,需要通过别的方法统计
3.1查看那些表包含boob clob字段
因为boob clob字段要单独统计,这个sql可以查询出来用户下哪些表包含boob clob字段
SELECT table_name, column_name
FROM all_tab_columns
WHERE data_type IN ('BLOB', 'CLOB') and owner='C##BBP402CYTJDEV41';
3.2带blob字段的表单独统计,以TJ_PHOTO_SFZH 表为例
--&SCHEMA &TABNAME解释: PLSQL在执行含有&语句的时候会弹窗 &后边的被认为含有参数需要传递:
SELECT
(SELECT ROUND(SUM(S.BYTES)/1024/1024,2) -- The Table Segment size
FROM DBA_SEGMENTS S
WHERE S.OWNER = UPPER('&SCHEMA')
AND S.SEGMENT_NAME = UPPER('&TABNAME')) +
(SELECT ROUND(SUM(S.BYTES)/1024/1024,2) -- The Lob Segment Size
FROM DBA_SEGMENTS S, DBA_LOBS L
WHERE S.OWNER = L.OWNER
AND L.SEGMENT_NAME = S.SEGMENT_NAME
AND L.TABLE_NAME = UPPER('&TABNAME')
AND L.OWNER = UPPER('&SCHEMA')) +
(SELECT ROUND(SUM(S.BYTES)/1024/1024,2) -- The Lob Index size
FROM DBA_SEGMENTS S, DBA_INDEXES I
WHERE S.OWNER = I.OWNER
AND I.INDEX_NAME = S.SEGMENT_NAME
AND I.TABLE_NAME = UPPER('&TABNAME')
AND INDEX_TYPE = 'LOB'
AND I.OWNER = UPPER('&SCHEMA')) +
(SELECT ROUND(SUM(S.BYTES)/1024/1024,2) -- The Index size
FROM DBA_SEGMENTS S, DBA_INDEXES I
WHERE S.OWNER = I.OWNER
AND I.INDEX_NAME = S.SEGMENT_NAME
AND I.TABLE_NAME = UPPER('&TABNAME')
AND INDEX_TYPE = 'NORMAL'
AND I.OWNER = UPPER('&SCHEMA'))
AS "TOTAL TABLE SIZE(MB)"
FROM DUAL;
查询出来单位为MB
4.常见问题-某张表占用空间太大
发现某张表占用空间太大
已经上线的项目新加的表空间几个月就达到32G无法了,由于32G无法在扩展,导致系统宕机,排查发现 可使用的空间是64G,而 TJ_XM_PICTURE表 居然占用了64GB空间,需要针对性优化

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)