AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 132620
Accepted
b.roth
b.roth
Asked: 2010-04-16 01:30:40 +0800 CST2010-04-16 01:30:40 +0800 CST 2010-04-16 01:30:40 +0800 CST

Oracle:如何找出表使用的存储空间?

  • 772

如何找出(如果可能通过企业管理器)某个表正在使用的总 Mb?

oracle storage oracle10g
  • 4 4 个回答
  • 183898 Views

4 个回答

  • Voted
  1. Best Answer
    Guy
    2010-04-16T03:24:11+08:002010-04-16T03:24:11+08:00

    通过 OEM 10g,

    1. 像往常一样连接到数据库
    2. 单击Schema选项卡
    3. Tables在数据库对象内的链接上
    4. 输入架构名称和对象名称(可选)并单击Go
    5. 使用单选按钮选择要查看的表并单击Edit (不要单击表名链接)
    6. 单击Segments选项卡(并等待...)
    7. 您将看到表数据的大小和使用的索引。

    好的,这在技术上回答了你的问题。但更好的方法是:

    1. 使用 SQLPLUS 登录
    2. 从文森特运行脚本。

    我喜欢将脚本保存t.sql为快速参考

    COLUMN size_mb      FORMAT '999,999,990.0'
    COLUMN num_rows     FORMAT '999,999,990'
    COLUMN fmt_short    FORMAT A24
    
    
    COLUMN owner        FORMAT A16
    COLUMN table_name   LIKE fmt_short
    COLUMN tablespace_name  LIKE fmt_short
    
    SET LINESIZE 200
    SET AUTOTRACE OFF
    
    COMPUTE SUM OF size_mb ON REPORT
    BREAK ON REPORT
    
    SELECT 
        lower( owner )      AS owner
        ,lower(table_name)  AS table_name
        ,tablespace_name
        ,num_rows
        ,blocks*8/1024      AS size_mb
        ,pct_free
        ,compression 
        ,logging
    FROM    all_tables 
    WHERE   owner           LIKE UPPER('&1')
    OR  owner           = USER
    ORDER BY 1,2;
    
    CLEAR COMPUTES
    CLEAR BREAKS
    
    • 18
  2. Vincent
    2010-04-16T02:02:20+08:002010-04-16T02:02:20+08:00

    表使用的空间是其所有范围使用的空间:

    SELECT SUM(bytes), SUM(bytes)/1024/1024 MB
        FROM dba_extents
        WHERE owner = :owner
        AND segment_name = :table_name;
    
    SUM(BYTES)         MB
    ---------- ----------
    3066429440   2924,375
    
    • 13
  3. Gunther Schadow
    2012-10-19T05:21:08+08:002012-10-19T05:21:08+08:00

    您确定使用 all_tables 视图的原始方法包括 LOB 范围吗?我认为不会。这是我发现有用的一个:

    with da as (
     SELECT owner, segment_name, SUM(bytes)/1024/1024 size_mb
       FROM dba_extents
       group by rollup(owner, segment_name)
    ) select owner, segment_name, size_mb, round(size_mb/total_mb*100)
      from da 
        cross join (
          select size_mb as total_mb 
          from da t where owner is null and segment_name is null
        )
    order by size_mb desc
    

    它向我展示了使用最多空间的内容。

    • 8
  4. jeromerg
    2017-08-03T00:14:42+08:002017-08-03T00:14:42+08:00

    经过一些谷歌搜索和实验,我构建了以下查询,它提供了我认为最准确的结果。对于 oracle 用户,它按表和段类型(TABLE *、INDEX *、LOB *)提供可用/已用/总空间。您可以轻松扩展它以提供额外的统计信息,如块数。

    典型输出是:

    table    ; segment type  ; used (mb) ; unused (mb) ;  total (mb)
    user     ; INDEX         ;       0,78;         0,00;         0,78
    user     ; LOBINDEX      ;       0,15;         0,00;         0,15
    user     ; LOBSEGMENT    ;       3,48;         1,19;         4,67
    user     ; TABLE         ;      12,11;         2,74;        14,85
    address  ; INDEX         ;       0,12;         0,00;         0,12
    (...)
    

    脚本:

    DECLARE
      input_owner         NVARCHAR2(128) := 'MY_ORACLE_OWNER';
      segment_size_blocks NUMBER;
      segment_size_bytes  NUMBER;
      used_blocks         NUMBER;
      used_bytes          NUMBER;
      expired_blocks      NUMBER;
      expired_bytes       NUMBER;
      unexpired_blocks    NUMBER;
      unexpired_bytes     NUMBER;
      total_blocks        NUMBER;
      total_bytes         NUMBER;
      unused_blocks       NUMBER;
      unused_bytes        NUMBER;
      last_ext_file_id    NUMBER;
      last_ext_blk_id     NUMBER;
      last_used_blk       NUMBER;
      result_table        NVARCHAR2(128);
      result_segment_type NVARCHAR2(128);
      result_used_mb      NUMBER;
      result_unused_mb    NUMBER;
      result_total_mb     NUMBER;
      CURSOR cur
      IS
        SELECT
          s.segment_name   AS segment_name,
          s.owner          AS segment_owner,
          s.partition_name AS partition_name,
          s.segment_type   AS segment_type,
          CASE WHEN s.segment_type IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
            THEN s.segment_name
          WHEN s.segment_type IN ('INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION')
            THEN (SELECT i.table_name
                  FROM dba_indexes i
                  WHERE s.segment_name = i.index_name AND s.owner = i.owner)
          WHEN s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION')
            THEN (SELECT l.table_name
                  FROM dba_lobs l
                  WHERE s.segment_name = l.segment_name AND s.owner = l.owner)
          WHEN s.segment_type IN ('LOBINDEX')
            THEN (SELECT l.table_name
                  FROM dba_lobs l
                  WHERE s.segment_name = l.index_name AND s.owner = l.owner)
          ELSE 'Unknown'
          END              AS table_name,
          s.bytes          AS segment_bytes
        FROM dba_segments s
        WHERE owner = input_owner
        ORDER BY table_name, segment_type;
    BEGIN
      dbms_output.put_line('table                         ; segment type        ;   used (mb)     ; unused (mb)     ;  total (mb)');
    
      FOR ro IN cur
      LOOP
    
        result_table := ro.table_name;
        result_segment_type := ro.segment_type;
    
        IF ro.segment_type IN ('TABLE', 'INDEX')
        THEN
          dbms_space.unused_space(
              segment_owner             => ro.segment_owner,
              segment_name              => ro.segment_name,
              segment_type              => ro.segment_type,
              total_blocks              => total_blocks,
              total_bytes               => total_bytes,
              unused_blocks             => unused_blocks,
              unused_bytes              => unused_bytes,
              last_used_extent_file_id  => last_ext_file_id,
              last_used_extent_block_id => last_ext_blk_id,
              last_used_block           => last_used_blk);
    
          result_used_mb := (total_bytes - unused_bytes) / 1024 / 1024;
          result_unused_mb := unused_bytes / 1024 / 1024;
          result_total_mb := total_bytes / 1024 / 1024;
    
        ELSIF ro.segment_type IN ('LOBSEGMENT')
        THEN
          dbms_space.space_usage(
              segment_owner           => ro.segment_owner,
              segment_name            => ro.segment_name,
              segment_type            => 'LOB',
              partition_name          => ro.partition_name,
              segment_size_blocks     => segment_size_blocks,
              segment_size_bytes      => segment_size_bytes,
              used_blocks             => used_blocks,
              used_bytes              => used_bytes,
              expired_blocks          => expired_blocks,
              expired_bytes           => expired_bytes,
              unexpired_blocks        => unexpired_blocks,
              unexpired_bytes         => unexpired_bytes
          );
          result_used_mb := used_bytes / 1024 / 1024;
          result_unused_mb := (segment_size_bytes - used_bytes) / 1024 / 1024;
          result_total_mb := segment_size_bytes / 1024 / 1024;
        ELSE
          -- TODO ??
          result_used_mb := ro.segment_bytes / 1024 / 1024;
          result_unused_mb := 0;
          result_total_mb := result_used_mb + result_unused_mb;
        END IF;
    
        dbms_output.put_line(
            RPAD(result_table, 30) || '; ' ||
            RPAD(result_segment_type, 20)|| '; ' ||
            TO_CHAR(result_used_mb  / 1024 / 1024, '999999999990D00')|| '; ' ||
            TO_CHAR(result_unused_mb  / 1024 / 1024, '999999999990D00')|| '; ' ||
            TO_CHAR(result_total_mb / 1024 / 1024, '999999999990D00'));
    
      END LOOP;
    END;
    
    • 3

相关问题

  • 更改 Oracle 数据库的语言(代码页)

  • 安装 Oracle 数据库

  • Oracle 10 g - 无法释放表空间中的空间

  • Oracle 10g:备份失败,日志磁盘已满——如何恢复数据库?

  • 通过 SqlPlus 导出 Oracle BLOB

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve