Oracle 19c中DBA_SEGMENTS未显示新分区表,求查子分区大小
解决Oracle 19c分区表子分区大小查询无结果的问题
常见原因及对应解决方法
1. 查询权限不足
DBA_SEGMENTS需要SELECT ANY DICTIONARY权限或DBA角色才能访问。如果你是表的所有者,建议改用USER_SEGMENTS或USER_TAB_SUBPARTITIONS,无需额外权限即可查询自己的表信息。
2. 表名匹配问题
- 你的查询中使用
SEGMENT_NAME LIKE 'TABLENAME',若需精确匹配,应改用=;若需模糊匹配,需添加通配符%(如SEGMENT_NAME LIKE '%TABLENAME%')。 - 如果创建表时使用双引号指定了区分大小写的表名(如
"tablename"),查询时需保留双引号:SEGMENT_NAME = '"tablename"'。
3. 子分区未创建段
如果分区表是自动分区(如Interval分区),或子分区尚未插入任何数据,对应的段不会被创建,DBA_SEGMENTS中自然没有记录。此时可通过DBA_TAB_SUBPARTITIONS查看子分区的元数据及初始分配大小。
4. 查询语句未精准过滤子分区
原查询包含了多种段类型,建议直接过滤SEGMENT_TYPE = 'TABLE SUBPARTITION'以精准定位子分区。
实用查询语句
确认子分区是否存在
SELECT table_name, partition_name, subpartition_name, status FROM DBA_TAB_SUBPARTITIONS WHERE table_name = '你的真实表名' ORDER BY partition_name, subpartition_name;
查询子分区大小(含未生成段的子分区)
SELECT owner, table_name, partition_name, subpartition_name, ROUND(bytes/1024/1024/1024, 2) "GB", tablespace_name FROM DBA_TAB_SUBPARTITIONS WHERE table_name = '你的真实表名' ORDER BY partition_name, subpartition_name;
查询已生成段的子分区大小(通过DBA_SEGMENTS)
SELECT owner, segment_name, segment_type, partition_name, subpartition_name, ROUND(bytes/1024/1024/1024, 2) "GB", tablespace_name FROM DBA_SEGMENTS WHERE SEGMENT_TYPE = 'TABLE SUBPARTITION' AND SEGMENT_NAME = '你的真实表名' ORDER BY bytes DESC;
内容的提问来源于stack exchange,提问作者vigneshwar reddy
相关产品推荐
相关产品推荐

