我们有一个新的分区表。我想获取每个子分区的大小(以 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;
尝试使用上述查询,但我没有看到任何带有我的表名的记录。
请帮忙查找每个子分区的新分区表相关大小信息。
从 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(+)