计算某个用户下表的大小

---------统计某用户下对象占用大小-----------------------------------------

SELECT T.TOWNER, SUM(T.BYTES) / 1024 /1024/1024 SUMS_G

 FROM (SELECT C.owner TOWNER,C.segment_name TABLENAME, C.BYTES BYTES

         FROM DBA_SEGMENTS C

        WHERE C.owner='RMGZ'

          AND C.segment_type NOT IN ('LOBINDEX', 'INDEX','LOBSEGMENT')

       UNION

       SELECT B.owner, B.table_name, A.BYTES BYTES

         FROM (SELECT owner, SEGMENT_NAME, BYTES

                  FROM DBA_SEGMENTS

                 WHERE owner = 'RMGZ') A,

               DBA_INDEXES B

        WHERE A.SEGMENT_NAME = B.index_name

          AND B.owner = 'RMGZ') T

 --WHERE T.TABLENAME NOT LIKE 'BIN$%'

 GROUP BY T.TOWNER

 ORDER BY SUM(T.BYTES) / 1024 / 1024/1024 DESC

 

 

--------统计某用户下指定表的大小-------------------------------------------

SELECT SUM(T.BYTES) / 1024 / 1024 / 1024SUMS_G

 FROM (SELECT C.owner TOWNER, C.segment_name TABLENAME, C.BYTES BYTES

         FROM DBA_SEGMENTS C

        WHERE C.owner = 'RMGZ'

          AND C.segment_name = 'ADDR'

        UNION

       SELECT B.owner, B.table_name, A.BYTES BYTES

         FROM (SELECT owner, SEGMENT_NAME, BYTES

                  FROM DBA_SEGMENTS

                 WHERE owner = 'RMGZ') A,

               DBA_INDEXES B

        WHERE A.SEGMENT_NAME = B.index_name

          AND B.table_name = 'ADDR'

          AND B.owner = 'RMGZ') T

 

 

--------统计某用户下各个表占用空间大小-------------------------------------

SELECT T.TOWNER,t.TABLENAME,TRUNC(SUM(T.BYTES) / 1024 / 1024) SUMS_M

 FROM (SELECT C.owner TOWNER,C.segment_name TABLENAME, C.BYTES BYTES

         FROM DBA_SEGMENTS C

        WHERE C.owner='RMGZ'

          AND C.segment_type NOT IN ('LOBINDEX', 'INDEX','LOBSEGMENT')

       UNION

       SELECT B.owner, B.table_name, A.BYTES BYTES

         FROM (SELECT owner, SEGMENT_NAME, BYTES

                  FROM DBA_SEGMENTS

                 WHERE owner = 'RMGZ') A,

               DBA_INDEXES B

        WHERE A.SEGMENT_NAME = B.index_name

          AND B.owner = 'RMGZ') T

 --WHERE T.TABLENAME NOT LIKE 'BIN$%'

 GROUP BY T.TOWNER,t.TABLENAME

 ORDER BY SUM(T.BYTES) / 1024 / 1024 DESC

<think>好的,用户需要查询Oracle数据库中某个用户下每张大小,并且要排除回收站中的。首先,我得确定在Oracle中如何获取大小信息。通常,大小可以通过数据字典视图来查询,比如DBA_SEGMENTS或者USER_SEGMENTS,因为这些视图存储了段(如、索引等)的信息,包括占用空间的大小。接下来,用户提到要排除回收站中的。Oracle的回收站中的通常会被重命名,名称前面带有"BIN$"这样的前缀。所以,在查询的时候需要过滤掉这些名。可以通过在WHERE子句中使用条件来排除名以"BIN$"开头的。 然后,我需要考虑权限问题。用户是否有权限访问DBA_SEGMENTS视图?如果用户没有DBA权限,可能需要使用USER_SEGMENTS视图,但USER_SEGMENTS只能查看当前用户下的段。所以,如果用户需要查询其他用户下的,可能需要使用DBA_SEGMENTS,并且确保用户有相应的权限,比如SELECT_CATALOG_ROLE或者被授予直接查询DBA_SEGMENTS的权限。 接下来,编写SQL语句。基本的查询结构应该是选择SEGMENT_NAME和BYTES,从DBA_SEGMENTS视图中,其中SEGMENT_TYPE是'TABLE',并且所有者是目标用户,同时SEGMENT_NAME不以'BIN$'开头。可能需要将BYTES转换为更友好的单位,比如MB或GB,方便用户阅读。可以使用ROUND函数和除法来实现单位的转换。另外,用户可能需要考虑分区的情况。在DBA_SEGMENTS中,分区可能会有多个段,每个分区单独计算。如果用户希望每个的总大小,可能需要使用SUM和GROUP BY来聚合数据,按名分组。这时候需要注意,如果名有大小写的问题,但Oracle默认情况下会以大写形式存储数据字典中的对象名,所以需要确保查询中的名匹配正确。还有,回收站中的可能属于不同的用户,但用户可能只关心特定用户下的,所以需要明确指定OWNER字段为指定的用户名。例如,WHEREOWNER= 'USERNAME'。测试一下这个SQL语句是否有效。比如,执行以下查询:SELECT SEGMENT_NAME ASTABLE_NAME,SUM(BYTES)/1024/1024 ASSIZE_MBFROM DBA_SEGMENTSWHEREOWNER= '目标用户'AND SEGMENT_TYPE ='TABLE'AND SEGMENT_NAME NOTLIKE 'BIN$%' GROUPBY SEGMENT_NAMEORDER BYSIZE_MB DESC; 这样应该能得到每个大小,排除回收站中的,并按MB显示,按大小降序排列。可能还需要提醒用户替换'目标用户'为实际的用户名,并且注意如果没有DBA权限,可能需要使用USER_SEGMENTS,但这样只能查看当前用户下的。此外,回收站中的可能在其他视图中存在,比如USER_RECYCLEBIN,但通过过滤名称前缀已经足够。另外,用户可能需要考虑压缩的情况,或者是否包括索引占用的空间。但根据问题描述,用户可能只需要本身的大小,不包括索引,所以SEGMENT_TYPE='TABLE'是正确的。如果用户需要包括索引,可能需要调整查询条件,但问题中没有提到这点,所以暂时不考虑。 总结一下,步骤是:确定使用正确的数据字典视图,过滤回收站名,按用户名分组统计大小,转换单位,排序结果。同时处理权限问题和可能的注意事项,比如分区的影响。</think>要查询Oracle数据库中某个用户下每张大小(排除回收站中的),可通过以下步骤实现: --- ### 1. 使用数据字典视图`DBA_SEGMENTS` 该视图记录了所有数据库段的存储信息,包括、索引等。通过筛选`SEGMENT_TYPE = 'TABLE'`和`OWNER`字段,可获取目标用户大小。 ```sql SELECT SEGMENT_NAME AS TABLE_NAME, SUM(BYTES)/1024/1024 AS SIZE_MB FROM DBA_SEGMENTS WHERE OWNER = '目标用户' -- 替换为实际用户名 AND SEGMENT_TYPE = 'TABLE' AND SEGMENT_NAME NOT LIKE 'BIN$%' -- 排除回收站中的(名称以BIN$开头) GROUP BY SEGMENT_NAME ORDER BY SIZE_MB DESC; ``` --- ### 2. 关键解释 - **排除回收站**:回收站中的名称以`BIN$`开头,通过`NOT LIKE 'BIN$%'`过滤[^1]。 - **权限要求**:若用户无`DBA_SEGMENTS`访问权限,需授予`SELECT_CATALOG_ROLE`或直接授权: ```sql GRANT SELECT ON DBA_SEGMENTS TO 用户名; ``` - **单位转换**:`BYTES`字段单位为字节,通过`/1024/1024`转换为MB。 --- ### 3. 替代方案(无DBA权限时) 使用`USER_SEGMENTS`视图(仅查看当前用户下的): ```sql SELECT SEGMENT_NAME AS TABLE_NAME, SUM(BYTES)/1024/1024 AS SIZE_MB FROM USER_SEGMENTS WHERE SEGMENT_TYPE = 'TABLE' AND SEGMENT_NAME NOT LIKE 'BIN$%' GROUP BY SEGMENT_NAME; ``` --- ### 注意事项 - 分区:若为分区,`DBA_SEGMENTS`会为每个分区单独统计,需通过`GROUP BY`聚合。 - 回收站清理:彻底删除回收站可执行: ```sql PURGE RECYCLEBIN; -- 清理当前用户的回收站 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值