Oracle含LOB大字段表的存储占用统计
- [1 环境说明](#1 环境说明)
1 环境说明
CPU X86
Os CentOS 7
ORACLE 11.2.0.4.0
- 本脚本用于统计 Oracle 数据库中所有包含大字段(LOB)的表空间占用情况 。它通过关联
dba_tables、dba_segments与dba_lobs数据字典视图,一次性汇总出每张含 LOB 字段的表的真实存储占用,帮助 DBA 快速定位"占用空间大表"。
脚本输出三个核心指标:
- 表数据大小(GB) :表数据段(
TABLE段)本身占用的空间。 - LOB总大小(GB) :该表下所有 LOB 段(
LOBSEGMENT)与 LOB 索引段(LOBINDEX)的合计占用。 - 真实总大小(GB):表数据与 LOB 占用之和,反映该表的真实存储成本。
- 说明:仅统计包含 LOB 字段的表(
lob_seg.table_name IS NOT NULL),并按真实总大小降序排列,便于一眼锁定存储占用最高的表。
sql
SELECT
t.owner AS "表所有者",
t.table_name AS "表名",
-- 1. 表数据段本身的大小 (GB)
ROUND(NVL(tab_seg.bytes, 0) / 1024 / 1024 / 1024, 2) AS "表数据大小(GB)",
-- 2. 关联的LOB段和LOB索引段的总大小 (GB)
ROUND(NVL(lob_seg.total_lob_bytes, 0) / 1024 / 1024 / 1024, 2) AS "LOB总大小(GB)",
-- 3. 表的真实总占用空间 (表数据 + LOB)
ROUND((NVL(tab_seg.bytes, 0) + NVL(lob_seg.total_lob_bytes, 0)) / 1024 / 1024 / 1024, 2) AS "真实总大小(GB)"
FROM
dba_tables t
-- 关联查询表数据段的大小
LEFT JOIN dba_segments tab_seg
ON t.owner = tab_seg.owner
AND t.table_name = tab_seg.segment_name
AND tab_seg.segment_type = 'TABLE'
-- 关联查询该表下所有LOB段和LOB索引段的大小总和
LEFT JOIN (
SELECT
l.owner,
l.table_name,
SUM(s.bytes) AS total_lob_bytes
FROM dba_lobs l
JOIN dba_segments s
ON l.owner = s.owner
AND (l.segment_name = s.segment_name OR l.index_name = s.segment_name)
WHERE s.segment_type IN ('LOBSEGMENT', 'LOBINDEX')
GROUP BY l.owner, l.table_name
) lob_seg
ON t.owner = lob_seg.owner
AND t.table_name = lob_seg.table_name
WHERE
lob_seg.table_name IS NOT NULL -- 仅筛选包含LOB字段的表
ORDER BY
"真实总大小(GB)" DESC; -- 按真实总大小降序排列,快速定位"占用空间大表"