【问题标题】:query to check the size in GB of the table per specific component查询以检查每个特定组件的表大小(以 GB 为单位)
【发布时间】:2021-02-26 10:40:06
【问题描述】:

我需要检查每个系统每天特定表占用的空间,只是一个简短的背景我有大约 10 个系统来自我们处理每日 etl 负载的每个系统,并且可以根据日期观察计数字段。

数据库 oracle 11g

每 GB 大小

例子

SYSTEM PROCESS_DATE count(*)

RETAIL 26.02.2021   100
PHARMACY 26.02.2021 200
BANKING  26.02.2021 300

查询 1 - 检查每个系统的每日计数

select distinct system,count(*) from AUDIT_SCH.DWH_ADT_TBL
where trunc(process_date)=trunc(sysdate)
group by system
order by count(*) desc;

但我想要的是如何从该表中捕获每个系统消耗的每日负载空间? ,这可能吗

检查下面的各种建议令人困惑是参考

How do I calculate tables size in Oracle

对查询有什么建议吗?

【问题讨论】:

标签: sql oracle plsql database-administration


【解决方案1】:

使用函数VSIZE 对每个系统每列中使用的字节数求和:

select
    system, count(*),
    round(sum
    (
        nvl(vsize(system), 0) +
        nvl(vsize(process_date), 0) +
        nvl(vsize(column1), 0) +
        nvl(vsize(column2), 0)
        --Add all other columns here
    )/1024/1024/1024) gb
from DWH_ADT_TBL
where trunc(process_date)=trunc(sysdate)
group by system
order by count(*) desc;

不幸的是,计算数据库中事物的大小可能非常复杂。您可能需要担心:

  1. 开销。VSIZE 函数不考虑行开销、块开销、段开销和文件/ASM 磁盘组/卷中的未使用空间等。
  2. 压缩。如果表、表空间或 LOB 被压缩或加密,VSIZE 将错误地返回未压缩的大小。
  3. 索引。 VSIZE 不包括索引大小。但是,如果您只对比较系统感兴趣,那么即使绝对大小关闭,数据的百分比仍然相同。 (除非您有仅由一个系统使用的索引列。)
  4. LOB。您可能需要使用DBMS_LOB.GETLENGTH 来计算 LOB 的大小。对于 CLOB,您可能需要根据字符集将结果乘以 2 - 对于 UCS2,每个字符使用 2 个字节。

但在实践中,上述查询仍然足以让您对空间的使用位置有一个很好的了解。

如果您有多个包含许多列的表,您可以使用数据字典生成查询,方法是从 DBA_TAB_COLUMNS 查询。

【讨论】:

  • 检查的好方法,如何识别结果是否以 GB/MB/TB 为单位,通常我们会放一些类似示例 - ROUND(BYTES) / 1024 / 1024 / 1024 AS GB 但是当我在尝试测试它不起作用 ORA-00923: FROM 关键字未在预期的位置找到 00923. 00000 - “FROM 关键字未在预期的位置找到” *原因:*操作:行错误:10 列:12
  • 使用更新的逻辑后,我得到 0 行
  • @rakesh 这可能是因为trunc(process_date)=trunc(sysdate) - 也许周末没有加载数据,所以今天没有行?请改用trunc(process_date) = date '2021-02-26'。
  • 我也试过了,过去几天我也切换了,我可以看到计数,如果我在 GB 部分 0 下应用新更新的条件
  • @rakesh 也许数据不够大 - 尝试使用1024/1024 表示 MB 而不是 1024/1024/1024 表示 GB。
猜你喜欢
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
相关资源
最近更新 更多