zoukankan      html  css  js  c++  java
  • 查看oracle库中用户及其表的内存大小

    某天小白我接到一个小小的一句话的任务,让我把目前项目的数据库所有表的大小统计下,其实这种操作对于你们大多数人可能都是随手拈来的事,但是我不行,所有就为自己做了一个简单记录。基本都百度上的,有问题之处请不吝赐教!!!

    1、某个表大小查询:

    以通过系统视图DBA_SEGMENTS、DBA_TABLES、USER_SEGMETNS、User_Extents来查看一个表所占空间的大小;需要注意的是由于统计信息过时或总是持续有DML操作,所以内容是统计不准的。

    第一种方式:
    SELECT SEGMENT_NAME              TABLE_NAME
          ,SUM(BLOCKS)               BLOCKS
          ,SUM(BYTES)/(1024*1024)    "TABLE_SIZE[MB]"
    FROM USER_SEGMENTS
    WHERE  SEGMENT_TYPE='TABLE'
       AND SEGMENT_NAME='你要查询的表名'
    GROUP BY SEGMENT_NAME;
    第二种方式:
    SELECT SEGMENT_NAME              TABLE_NAME
          ,SUM(BLOCKS)               BLOCKS
          ,SUM(BYTES)/(1024*1024)    "TABLE_SIZE[MB]"
    FROM DBA_SEGMENTS
    WHERE  SEGMENT_TYPE='TABLE'
       AND SEGMENT_NAME='你要查询的表名'
    GROUP BY SEGMENT_NAME;
    第三种方式:
    ANALYZE TABLE 用户名.表名 COMPUTE STATISTICS; --收集表对象的统计信息
    SELECT OWNER                    OWNER_NAME
          ,TABLE_NAME               TABLE_NAME
          ,TABLESPACE_NAME          TABLESPACE_NAME
          ,BLOCKS                   ACTUAL_BLOCKS
          ,BLOCKS + EMPTY_BLOCKS    TOTAL_BLOCKS
          ,(BLOCKS + EMPTY_BLOCKS) * 8192/(1024*1024)
                                    "TABLE_SIZE[MB]"
    FROM DBA_TABLES
    WHERE OWNER='用户名(大写)'
      AND TABLE_NAME='表名(大写)'
    第四种方式:
    --注,仅表数据的大小,不含索引、分区、LOB类型
    SELECT SEGMENT_NAME "表名",sum(bytes)/1024/1024 "表大小(M)" 
    From User_Extents 
    Group By Segment_Name   
    having Segment_Name='你要查询的表名'; 

    注意:

    1、通过系统视图DBA_TABELS、USER_TABLES、USER_EXENTS统计空间大小有可能不准。

    2、DBA_TABLES和DBA_SEGMENTS表中的block的区别:DBA_SEGMENTS中的blocks表示分配给表的存储空间,而DBA_TABLES中blocks表示表中数据实际占有的存储空间;所以这个是有细微差别的。如果要查表的实际占用大小,使用DBA_TABLES来查询是比较准确的,但是需要先收集一下表对象的统计信息。 

    3、数据库的db_block_size有所不同,不一定是8192,使用下面sql可查询

    select name,value from v$parameter where name='db_block_size';

    2、查看某个用户下各个表所占的空间:

    select OWNER "用户名", t.segment_name "表名", t.segment_type "表类型", sum(t.bytes / 1024 / 1024) "表大小M"
    from dba_segments t
    where t.owner = '你要查询的用户'
    and t.segment_type='TABLE'
    group by OWNER, t.segment_name, t.segment_type
    order by "表大小M" desc;

    3、查看数据库所有用户下全部表所占的总空间

    SELECT OWNER as "用户名", sum(BYTES) / 1024 / 1024 as "所有表的大小(MB)"
      FROM DBA_SEGMENTS
     WHERE SEGMENT_NAME in (select t2.OBJECT_NAME
                              from dba_objects t2
                             where t2.OBJECT_TYPE = 'TABLE')
     group by OWNER order by 2 desc;

    4、查询某用户下所有表的记录总数:

    SELECT SUM(num_rows) "记录总条数" FROM SYS.ALL_TABLES T WHERE T.OWNER = '你要查询的用户';

    5、查看户下所有表的各自的记录条数:

    SELECT T.TABLE_NAME "表名",T.NUM_ROWS "记录条数" FROM USER_TABLES T;

    6、查看当前用户下所有表的表名所属表空间:

    select table_name "表名",tablespace_name "所属表空间" from user_tables;

    7、查看当前用户下所有表空间的使用情况:

    SELECT a.tablespace_name "表空间名", 
    total / (1024 * 1024) "表空间大小(M)", 
    free / (1024 * 1024) "表空间剩余大小(M)", 
    (total - free) / (1024 * 1024) "表空间使用大小(M)", 
    round((total - free) / total, 4) * 100 "使用率 %" 
    FROM (SELECT tablespace_name, SUM(bytes) free 
    FROM dba_free_space 
    GROUP BY tablespace_name) a, 
    (SELECT tablespace_name, SUM(bytes) total 
    FROM dba_data_files 
    GROUP BY tablespace_name) b 
    WHERE a.tablespace_name = b.tablespace_name;

     8、查询用户及使用的表空间:

    select username,default_tablespace from dba_users ;

    9、oracle系统表

    dba_tables : 系统里所有的表的信息,需要DBA权限才能查询
    all_tables : 当前用户有权限的表的信息(只要对某个表有任何权限,即可在此视图中看到表的相关信息)
    user_tables: 当前用户名下的表的信息

  • 相关阅读:
    概述反射和序列化
    读书笔记6pandas简单使用
    读书笔记5基于matplotlib画图
    读书笔记4数据的读入和保存
    读书笔记3数组的一些常用函数
    introduction to python for statistics,analysis笔记3
    introduction to python for statistics,analysis笔记2
    introduction to anaconda
    图像的线性空间滤波matlab实现
    C-I/O操作函数详解
  • 原文地址:https://www.cnblogs.com/zyanrong/p/12028672.html
Copyright © 2011-2022 走看看