暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中,贵公司的数据库有多大?大一点的表有多大?有多少行?

DB宝 2019-10-24
1136


题目部分

在Oracle中,贵公司的数据库有多大?大一点的表有多大?有多少行?


     

答案部分


对于数据库的大小,需要注意的问题是数据库的大小不能以表空间的分配大小而论,而应该以表空间的占用空间大小而论,并且需要减掉SYSTEMSYSAUXTEMPUndo这些表空间占用的空间。因为有的系统Undo空间可能分配得很大,比如500G,所以,计算数据库大小的时候应该排除这些表空间。这里作者给出自己一个常用的查询表空间大小的SQL语句,该SQL语句列出了表空间的名称、表空间的分配大小和使用大小,并且列出了所有表空间的总体情况,如下所示:

 1SET PAGESIZE 9999 LINE 9999
2COL TS_NAME FORMAT A30
3WITH WT1 AS
4 (SELECT TS.TABLESPACE_NAME,
5         DF.ALL_BYTES,
6         DECODE(DF.TYPE,
7                'D',
8                NVL(FS.FREESIZ, 0),
9                'T',
10                DF.ALL_BYTES - NVL(FS.FREESIZ, 0)) FREESIZ,
11         DF.MAXSIZ,
12         TS.BLOCK_SIZE,
13         TS.LOGGING,
14         TS.FORCE_LOGGING,
15         TS.CONTENTS,
16         TS.EXTENT_MANAGEMENT,
17         TS.SEGMENT_SPACE_MANAGEMENT,
18         TS.RETENTION,
19         TS.DEF_TAB_COMPRESSION,
20         DF.TS_DF_COUNT 
21  FROM   DBA_TABLESPACES TS, 
22         (SELECT 'D' TYPE,
23                 TABLESPACE_NAME,
24                 COUNT(*) TS_DF_COUNT,
25                 SUM(BYTES) ALL_BYTES,
26                 SUM(DECODE(MAXBYTES, 0BYTES, MAXBYTES)) MAXSIZ 
27          FROM   DBA_DATA_FILES D
28          GROUP  BY TABLESPACE_NAME
29          UNION ALL 
30          SELECT 'T',
31                 TABLESPACE_NAME,
32                 COUNT(*) TS_DF_COUNT,
33                 SUM(BYTES) ALL_BYTES,
34                 SUM(DECODE(MAXBYTES, 0BYTES, MAXBYTES)) 
35          FROM   DBA_TEMP_FILES D
36          GROUP  BY TABLESPACE_NAME) DF, 
37         (SELECT TABLESPACE_NAME,
38                 SUM(BYTES) FREESIZ
39          FROM   DBA_FREE_SPACE
40          GROUP  BY TABLESPACE_NAME
41          UNION ALL
42          SELECT TABLESPACE_NAME,
43                 SUM(D.BLOCK_SIZE * A.BLOCKS) BYTES 
44          FROM   GV$SORT_USAGE   A,
45                 DBA_TABLESPACES D
46          WHERE  A.TABLESPACE = D.TABLESPACE_NAME
47          GROUP  BY TABLESPACE_NAME) FS
48  WHERE  TS.TABLESPACE_NAME = DF.TABLESPACE_NAME
49  AND    TS.TABLESPACE_NAME = FS.TABLESPACE_NAME(+))
50SELECT (SELECT A.TS#
51        FROM   V$TABLESPACE A
52        WHERE  A.NAME = UPPER(T.TABLESPACE_NAME)) TS#,
53       T.TABLESPACE_NAME TS_NAME,
54       ROUND(T.ALL_BYTES / 1024 / 1024) TS_SIZE_M,
55       ROUND(T.FREESIZ / 1024 / 1024) FREE_SIZE_M,
56       ROUND((T.ALL_BYTES - T.FREESIZ) / 1024 / 1024) USED_SIZE_M,
57       ROUND((T.ALL_BYTES - T.FREESIZ) * 100 / T.ALL_BYTES, 3) USED_PER,
58       ROUND(MAXSIZ / 1024 / 1024/10243) MAX_SIZE_G,
59       ROUND(DECODE(MAXSIZ, 0, TO_NUMBER(NULL), (T.ALL_BYTES - FREESIZ)) * 100 /
60             MAXSIZ,
61             3) USED_PER_MAX,
62       ROUND(T.BLOCK_SIZE) BLOCK_SIZE,
63       T.LOGGING,
64       T.TS_DF_COUNT 
65FROM   WT1 T
66UNION ALL
67SELECT TO_NUMBER('') TS#,
68       'ALL TS:' TS_NAME,
69       ROUND(SUM(T.ALL_BYTES) / 1024 / 10243) TS_SIZE_M,
70       ROUND(SUM(T.FREESIZ) / 1024 / 1024) FREE_SIZE_M,
71       ROUND(SUM(T.ALL_BYTES - T.FREESIZ) / 1024 / 1024) USED_SIZE_M,
72       ROUND(SUM(T.ALL_BYTES - T.FREESIZ) * 100 / SUM(T.ALL_BYTES), 3) USED_PER,
73       ROUND(SUM(MAXSIZ) / 1024 / 1024/1024) MAX_SIZE,
74       TO_NUMBER(''"USED,% OF MAX SIZE",
75       TO_NUMBER('') BLOCK_SIZE,
76       '' LOGGING,
77       TO_NUMBER('') TS_DF_COUNT 
78FROM   WT1 T
79ORDER BY TS#
80;

复制

执行以上的SQL语句,若有如下的结果:

可以说数据库大约有2205-751-629-14-2=809M,而并非是2.2G

至于大一点的表有多大?有多少行?这个问题考察DBA对自己库的熟悉程度,通过下面的SQL语句可以查询一个表的大小:

 1SYS@RACLHR2> SELECT *
2  2    FROM (SELECT D.OWNER, D.SEGMENT_NAME, (SUM(D.BYTES) / 1024 / 1024) SIZE_M
3  3            FROM DBA_SEGMENTS D
4  4           GROUP  BY D.OWNER, D.SEGMENT_NAME
5  5           ORDER BY SIZE_M DESC)
6  6   WHERE ROWNUM <= 5;
7OWNER      SEGMENT_NAME                           SIZE_M
8---------- ---------------------------------- ----------
9LKILL      T_KILL                                   7103
10SYS        I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST             50
11SYS        IDL_UB1$                                   35
12SYS        WRI$_OPTSTAT_HISTGRM_HISTORY               31
13SYS        WRH$_SYSMETRIC_HISTORY                     27
14SYS@RACLHR2> SELECT D.OWNER, D.TABLE_NAME, D.NUM_ROWS
15  2    FROM DBA_TABLES D
16  3   WHERE D.TABLE_NAME = 'T_KILL'
17  4   AND D.OWNER='LKILL';
18OWNER                          TABLE_NAME                       NUM_ROWS
19------------------------------ ------------------------------ ----------
20LKILL                          T_KILL                           44719104

复制

可以看到最大的表是LKILL用户下的T_KILL表,大约7G约有4400W的数据,读者应该以自己实际管理的库为准。

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗



---------------优质麦课------------

详细内容可以添加麦老师微信或QQ私聊。



About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

 提供OCP、OCM和高可用部分最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

DBA宝典

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。


最后修改时间:2020-01-10 17:49:10
文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论