Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

14

主题
1#
发表于 2013-5-23 22:10:53 | 查看: 4899| 回复: 12
近期经常需要统计一个财务库表的大小 但是这个库里的表有的有大字段 有的还有分区 请问刘大 有没有类似的脚本 可以准确统计一个表的大小 之前也在MOS上找过 没找到 希望刘大可以帮助一下
2#
发表于 2013-5-24 16:15:41
自己顶一下

回复 只看该作者 道具 举报

3#
发表于 2013-5-24 16:53:49
dba_segments 不能满足你需求?

回复 只看该作者 道具 举报

4#
发表于 2013-5-24 19:57:44
Maclean Liu(刘相兵 发表于 2013-5-24 16:53
dba_segments 不能满足你需求?

因为有的表存在大字段 所以光用dba_segments不够吧  所以想请问刘大有没有脚本 想偷个巧

回复 只看该作者 道具 举报

5#
发表于 2013-5-27 13:13:32
联立一下就ok了,给你我的脚本,可参考:

select owner,
       segment_type,
       case segment_type
         when 'TABLE' then
          segment_name
         when 'INDEX' then
          (select table_name
             from dba_indexes
            where index_name = s.segment_name
              and owner = s.owner)
         when 'LOBSEGMENT' then
          (select table_name
             from dba_lobs
            where segment_name = s.segment_name
              and owner = s.owner)
         when 'LOBINDEX' then
          (select table_name
             from dba_indexes
            where index_name = s.segment_name
              and owner = s.owner)
       end as table_name,
       segment_name,
       tablespace_name,
       round(bytes / 1024 / 1024) msize,
       blocks,
       sysdate dt
  from dba_segments s
where owner = 'NEWBIZ'
   and s.segment_name not like 'BIN$%'

回复 只看该作者 道具 举报

6#
发表于 2013-5-27 13:16:58
补充一下,由于之前的库中没有分区表,我这个脚本没考虑分区。
我比较懒,要等我遇到分区表的情况才会修改
你可以基于他完善下

回复 只看该作者 道具 举报

7#
发表于 2013-5-28 21:02:12
雪影舞剑 发表于 2013-5-27 13:16
补充一下,由于之前的库中没有分区表,我这个脚本没考虑分区。
我比较懒,要等我遇到分区表的情况才会修改
...

非常感谢!

回复 只看该作者 道具 举报

8#
发表于 2013-5-30 16:20:22
本帖最后由 repentance 于 2013-5-30 16:21 编辑

按用户统计用户数据空间使用情况
SELECT SYSDATE GATHER_TIME, OWNER,
                                                 TRUNC(SUM(BYTES) / 1024 / 1024) TOTAL_MB,
                                                 TRUNC(SUM(DECODE(A.SEGMENT_TYPE,'TABLE',A.BYTES,'TABLE PARTITION',A.BYTES,0)) / 1024 / 1024) TABLE_MB,
                                                 TRUNC(SUM(DECODE(A.SEGMENT_TYPE,'INDEX',A.BYTES,'INDEX PARTITION',A.BYTES,0)) / 1024 / 1024) INDEX_MB,
                                                 TRUNC(SUM(DECODE(A.SEGMENT_TYPE,
                                                                                                                         'LOBSEGMENT',
                                                                                                                         A.BYTES,
                                                                                                                         'LOBINDEX',
                                                                                                                         A.BYTES,
                                                                                                                         'LOB PARTITION',
                                                                                                                         A.BYTES,
                                                                                                                         0)) / 1024 / 1024) LOB_MB
                                FROM DBA_SEGMENTS A, DBA_USERS B
                         WHERE A.OWNER = B.USERNAME
                                 AND B.ACCOUNT_STATUS = 'OPEN'
                         GROUP BY OWNER
                         ORDER BY 3 DESC;

回复 只看该作者 道具 举报

9#
发表于 2013-6-1 10:17:10
repentance 发表于 2013-5-30 16:20
按用户统计用户数据空间使用情况
SELECT SYSDATE GATHER_TIME, OWNER,
                                                 TRUNC(SUM(BYTES) / 1024 / 1 ...

亲 我要统计的是表,但是这个脚本也挺有用,用得上。 谢谢! 收藏了

回复 只看该作者 道具 举报

10#
发表于 2013-6-3 14:21:23
14eer 发表于 2013-6-1 10:17
亲 我要统计的是表,但是这个脚本也挺有用,用得上。 谢谢! 收藏了

不好意思,没仔细看需求。见下面脚本
SELECT TMP1.OWNER, TMP1.TABLE_NAME, TMP1.NUM_ROWS,
                         TMP1.TABLE_MB + NVL(TMP2.BLOB_MB, 0) TOTAL_MB, TMP1.TABLE_MB,
                         NVL(TMP2.BLOB_MB, 0) BLOB_MB
        FROM (SELECT B.OWNER, B.TABLE_NAME, B.NUM_ROWS,
                                                                TRUNC(SUM(A.BYTES / 1024 / 1024)) TABLE_MB
                                         FROM DBA_SEGMENTS A, DBA_TABLES B
                                        WHERE A.SEGMENT_NAME = B.TABLE_NAME
                                                AND A.OWNER = B.OWNER
                                        GROUP BY B.OWNER, B.TABLE_NAME, B.NUM_ROWS) TMP1,
                         (SELECT A.OWNER, A.TABLE_NAME,
                                                                TRUNC(SUM(B.BYTES) / 1024 / 1024) BLOB_MB, 0, 'BLOB'
                                         FROM DBA_LOBS A, DBA_SEGMENTS B
                                        WHERE A.SEGMENT_NAME = B.SEGMENT_NAME
                                        GROUP BY A.OWNER, TABLE_NAME) TMP2
WHERE TMP1.OWNER = TMP2.OWNER(+)
         AND TMP1.TABLE_NAME = TMP2.TABLE_NAME(+)
         AND TMP1.TABLE_NAME = 'T_BLOB';

回复 只看该作者 道具 举报

11#
发表于 2013-6-3 22:18:38
repentance 发表于 2013-6-3 14:21
不好意思,没仔细看需求。见下面脚本
SELECT TMP1.OWNER, TMP1.TABLE_NAME, TMP1.NUM_ROWS,
                         TMP1.TAB ...

这两个脚本都很好 very 感谢^-^

回复 只看该作者 道具 举报

12#
发表于 2013-6-6 16:33:49
你也可以使用toad 中的 estimate size

回复 只看该作者 道具 举报

13#
发表于 2013-6-6 22:35:03
ShineCQY 发表于 2013-6-6 16:33
你也可以使用toad 中的 estimate size

没怎么接触过TOAD,所以还是希望能搞一个脚本 因为我们经常需要统计表的大小

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-16 15:28 , Processed in 0.049262 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569