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空间,需要针对性优化
在这里插入图片描述

Logo

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

更多推荐