DBA_SEGMENTS 在 oracle 19c 上不显示我的新分区表信息

问题描述 投票:0回答:1

我们有一个新的分区表。我想获取每个子分区的大小(以 GB 为单位)。 但是,在 dba_segments 中找不到与分区表相关的任何内容。

SELECT owner, segment_name, segment_type, partition_name,bytes/1024/1024/1024 "GB", tablespace_name
FROM DBA_SEGMENTS
WHERE SEGMENT_TYPE IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION',
'INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION')
AND SEGMENT_NAME LIKE 'TABLENAME'
ORDER BY bytes DESC;

尝试使用上述查询,但我没有看到任何带有我的表名的记录。

请帮忙查找每个子分区的新分区表相关大小信息。

sql oracle oracle19c
1个回答
0
投票

从 11.2 开始,Oracle 有一个名为

deferred_segment_creation
的参数,默认为
TRUE
。创建新表或分区时,它会创建逻辑对象,但尚未在表空间中分配空间,这意味着没有物理段。
dba_segments
仅显示物理段。您仍然可以在
dba_objects
dba_indexes
dba_tables
dba_tab_partitions
等中看到逻辑对象。其中名为
SEGMENT_CREATED
的列会显示
'NO'
,告诉您它尚未创建物理对象。尚未为该对象分段。

一旦插入一行,它现在必须创建一个物理段并在表空间中分配空间。此时行将显示在

dba_segments
中。

因此,要查看您的表,请从逻辑对象视图开始,然后在

dba_segments
上进行外连接以获得大小,将缺少任何此类行解释为没有段,因此大小为 0 字节:

SELECT sp.table_name,sp.partition_name,sp.subpartition_name,s.segment_type,NVL(s.bytes,0) bytes
  FROM dba_tab_subpartitions sp,
       dba_segments s
 WHERE sp.table_name = 'FACT_SESSION_WAITS'
   AND sp.table_owner = s.owner(+)
   AND sp.table_name = s.segment_name(+)
   AND sp.subpartition_name = s.partition_name(+)
 UNION ALL
SELECT i.index_name,sp.partition_name,sp.subpartition_name,s.segment_type,NVL(s.bytes,0) bytes
  FROM dba_indexes i,
       dba_ind_subpartitions sp,
       dba_segments s
 WHERE i.table_name = 'FACT_SESSION_WAITS'
   AND i.owner = sp.index_owner(+)
   AND i.index_name = sp.index_name(+)
   AND sp.index_owner = s.owner(+)
   AND sp.index_name = s.segment_name(+)
   AND sp.subpartition_name = s.partition_name(+) 
© www.soinside.com 2019 - 2024. All rights reserved.