oracle 11g表空间使用统计
本文研究有关oracle表空间统计的相关手段
- 传统的oracle表空间统计
- oracle11g新增表空间统计视图
- x$kttets
- v$filespace_usage
- sys.WRH$_TABLESPACE_SPACE_USAGE
- 保证快速及准确的查询表空间
传统的oracle表空间统计
传统的oracle表空间的统计是通过查询视图dba_data_files及dba_free_space统计出来的
例如这样:
select
tb1.Tablespace_name "Tablespace_name",
decode(sign(tb2.Sizes-0.99),1,round(tb2.Sizes,2) || 'GB',round(tb2.Sizes*1024,2) || 'MB') "Size",
decode(sign((tb2.Sizes-tb1.Free)-0.99),1,round((tb2.Sizes-tb1.Free),2) || 'GB',round((tb2.Sizes-tb1.Free)*1024,2) || 'MB') "Used",
decode(sign(tb1.Free-0.99),1,round(tb1.Free,2) || 'GB',round(tb1.Free*1024,2) || 'MB') "Free",
decode(sign(tb2.Max-0.99),1,round(tb2.Max,2) || 'GB',round(tb2.Max*1024,2) || 'MB') "Max",
to_number(round(((tb2.Sizes-tb1.Free)/tb2.Sizes)*100,2)) "Usage%",
to_number(round(((tb2.Sizes-tb1.Free)/tb2.Max)*100,2)) "Usageofmax%"
from
(select
tablespace_name,
round(sum(bytes)/power(2, 30),2) as Free
from dba_free_space
group by tablespace_name) tb1,
(select
tablespace_name,
round(sum(user_bytes)/power(2, 30),2) as Sizes,
round(sum(decode(autoextensible,'YES',maxbytes,'NO',bytes)/power(2, 30))) as Max
from dba_data_files
group by tablespace_name) tb2
where tb1.Tablespace_name=tb2.Tablespace_name;
这个查询无论数据文件是自增长还是非自增长的,统计的都是最准确的,因为dba_free_space的数据来源自最基础的系统表,准确性毋庸置疑。
但是在实际的使用过程中,我在某些数据库查询时,这条语句执行的非常缓慢,原因是dba_free_space的行数太多了,例如这样的解释计划:
| Id | Operation | Name | Rows | Bytes | TempSpc| Cost (%CPU)| Time |
……
| 26 | VIEW | | 16 | 480 | | 3036K(100)| 10:07:17 |
| 27 | HASH GROUP BY | | 16 | 352 | | 3036K(100)| 10:07:17 |
|