dba_tables与dba_segments中的blocks列的含义

博客介绍了Oracle数据库中dba_tables和dba_segments的blocks列含义,dba_tables的blocks列加1是高水位数据块号,empty_blocks指高水位后未使用block数量,分析表后可得准确值。还提到可通过dbms_space.unused_space过程获取相关值,以及使用特定命令回收高水位后未使用块,但回收后总块数为8的倍数。

dba_tables中的blocks列加1后指高水位的数据块号,高水位前面依然会有空块,empty_blocks指高水位后面(包括高水位)未被使用的block数量,注意对表进行分析后,才能得到这两个值的准确结果,使用dbms_space.unused_space过程也可以得到这两个值(具体方法参见黄河编著《Oracle 9i数据库系统管理培训教程(基础篇)》390页)。dba_segments中的blocks列指此表被分配到的block的总数,此视图不需要对表分析即可查询,也可通过查询dba_extents得到表被分配到的block及extent的总数。

使用:alter table table_name deallocate unused命令可以回收高水位后面未使用的块,但是回收后留下的总块数为8的倍数,从而一般会把未使用的块恰好全部回收。


dba_segments中的blocks列指此表被分配到的block的总数,此视图不需要对表分析即可查询,也可通过查询dba_extents得到表被分配到的block及extent的总数。

使用:alter table table_name deallocate unused命令可以回收高水位后面未使用的块,但是回收后留下的总块数为8的倍数,从而一般会把未使用的块恰好全部回收。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/37724/viewspace-152518/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/37724/viewspace-152518/

WITH seg_data AS ( /* 预分类处理段数据 */ SELECT s.owner, s.segment_name, s.partition_name, s.bytes, CASE WHEN s.segment_type IN ('TABLE', 'TABLE PARTITION') THEN 'TABLE' WHEN s.segment_type IN ('INDEX', 'INDEX PARTITION') THEN 'INDEX' WHEN s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION', 'LOBINDEX') THEN 'LOB' ELSE 'OTHER' END AS category FROM dba_segments s ) SELECT t.owner, t.table_name, ROUND(SUM(CASE WHEN sd.category = 'TABLE' THEN sd.bytes ELSE 0 END) / 1073741824, 2) AS table_size_gb, ROUND(SUM(CASE WHEN sd.category = 'INDEX' THEN sd.bytes ELSE 0 END) / 1073741824, 2) AS index_size_gb, ROUND(SUM(CASE WHEN sd.category = 'LOB' THEN sd.bytes ELSE 0 END) / 1073741824, 2) AS lob_size_gb, ROUND(SUM(sd.bytes) / 1073741824, 2) AS total_size_gb FROM dba_tables t /* 精确连接逻辑 */ LEFT JOIN ( /* 普通表段 */ SELECT owner, segment_name AS table_name, bytes, category FROM seg_data WHERE category = 'TABLE' UNION ALL SELECT p.table_owner AS owner, p.table_name, s.bytes, s.category FROM seg_data s JOIN dba_tab_partitions p ON s.partition_name = p.partition_name AND s.owner = p.table_owner WHERE s.category = 'TABLE' UNION ALL SELECT i.owner, i.table_name, s.bytes, s.category FROM seg_data s JOIN dba_indexes i ON s.segment_name = i.index_name AND s.owner = i.owner WHERE s.category = 'INDEX' UNION ALL SELECT l.owner, l.table_name, s.bytes, s.category FROM seg_data s JOIN dba_lobs l ON (s.segment_name = l.segment_name OR s.segment_name = l.index_name) AND s.owner = l.owner WHERE s.category = 'LOB' ) sd ON t.owner = sd.owner AND t.table_name = sd.table_name GROUP BY t.owner, t.table_name ORDER BY total_size_gb DESC; 能很快的出来结果 ,但数据都是0 ,请优化
08-01
WITH block_size AS ( SELECT value AS bytes_per_block FROM v$parameter WHERE name = 'db_block_size' ), -- 获取每个表的总大小 table_size AS ( SELECT s.owner, s.segment_name AS table_name, SUM(s.bytes) AS total_bytes FROM dba_segments s WHERE s.segment_type = 'TABLE' GROUP BY s.owner, s.segment_name ), -- 获取每个表的已使用空间 used_space AS ( SELECT t.owner, t.table_name, SUM(CASE WHEN a.blocks IS NULL THEN 0 ELSE a.blocks END) * (SELECT bytes_per_block FROM block_size) AS used_bytes FROM dba_tables t LEFT JOIN dba_extents a ON t.owner = a.owner AND t.table_name = a.segment_name GROUP BY t.owner, t.table_name ), -- 计算每个表的未使用空间 table_unused_space AS ( SELECT ts.owner, ts.table_name, ts.total_bytes, COALESCE(us.used_bytes, 0) AS used_bytes, ts.total_bytes - COALESCE(us.used_bytes, 0) AS unused_bytes, (ts.total_bytes - COALESCE(us.used_bytes, 0)) / ts.total_bytes * 100 AS unused_percentage FROM table_size ts LEFT JOIN used_space us ON ts.owner = us.owner AND ts.table_name = us.table_name ) -- 最终结果 SELECT owner, table_name, ROUND(total_bytes / (1024 * 1024 * 1024), 2) AS total_size_gb, ROUND(used_bytes / (1024 * 1024 * 1024), 2) AS used_size_gb, ROUND(unused_bytes / (1024 * 1024 * 1024), 2) AS unused_size_gb, ROUND(unused_percentage, 2) AS unused_percentage FROM table_unused_space --WHERE unused_percentage > 20 -- 过滤未使用空间占比超过50%的表 ORDER BY unused_percentage DESC; 解释 total_size_gb, used_size_gb, unused_size_gb, unused_percentage
最新发布
09-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值