关闭

Oracle查询表空间

标签: oracleSQL
63181人阅读 评论(0) 收藏 举报
分类:

    在项目长期的运行的情况下,数据会不断地增长,为保证业务及数据的正常运行与存储,需要保证数据库表有足够的空间对数据进行存储。

    在Oracle中,对于表空间的划分,Oracle使用了一种类似于Linux的mount的形式,需要时则分配一块存储空间挂载至某个表空间(附:表空间即某些表可以使用的存储空间大小)上。举个例子:相信大家应该见过大学食堂的大妈买粉面的情景,她们会把一撮撮的面分开来,当我们需要时间打卡付钱那么就给你煮一撮。Oracle的表空间分配就是这个道理,Oracle会以自己的方式将磁盘按一定的方式划分为“一块块”的,每一块的空间通常大小都是固定的4GB,这在Oracle中称之为“文件”,当某个表空间不足的时候,你只需要分配一个文件,然后将其分配给某个表空间即可。

    上边所说了这么一堆就是为了弄清楚一个道理,就是当使用SQL语句来查询Oracle的表空间时,不应该以“文件”为最小粒度,因为一个表空间可能会挂有非常多的文件,那么部分文件满了,而其它一部分没有满,这个道理不必多说,被误导判断,只要不小心就会是很容易的事。比如下面这个SQL,就是不合适的:

select b.file_id as "文件ID号", b.tablespace_name as "表空间名", 
b.bytes as "字节数",(b.bytes-sum(nvl(a.bytes,0))) as "已使用",
sum(nvl(a.bytes,0))as "剩余空间",sum(nvl(a.bytes,0))/(b.bytes)*100 as "剩余百分比" 
from dba_free_space a,dba_data_files b where a.file_id=b.file_id 
group by b.tablespace_name,b.file_id,b.bytes order by b.file_id

    这就是一个最小粒度是文件的栗子,百度会查到很多,如果被误导,那么就该醒醒了。下面给出应该使用的表空间查询方式:

MB版:

select 
       b.tablespace_name as "表空间名",
       count(distinct b.file_id) as "挂载文件数",
       (sum(nvl(b.bytes, 0)) - sum(nvl(a.bytes, 0))) / (1024 * 1024) as "已使用兆字节数",
       sum(b.bytes) / (1024 * 1024) as "表空间总兆字节数",
       sum(nvl(a.bytes, 0)) / (1024 * 1024) as "剩余空间",
       sum(nvl(a.bytes, 0)) / sum(nvl(b.bytes, 0)) * 100 as "剩余百分比"
from (select tablespace_name,file_id,sum(bytes) bytes from dba_free_space group by tablespace_name,file_id
) a
,dba_data_files b
 where b.file_id = a.file_id(+)
 group by b.tablespace_name
 order by b.TABLESPACE_NAME desc

GB版:
select 
       b.tablespace_name as "表空间名",
       count(distinct b.file_id) as "挂载文件数",
       (sum(nvl(b.bytes, 0)) - sum(nvl(a.bytes, 0))) / (1024 * 1024 * 1024) as "已使用吉比特数",
       sum(b.bytes) / (1024 * 1024 * 1024) as "表空间总吉比特数",
       sum(nvl(a.bytes, 0)) / (1024 * 1024 * 1024) as "剩余空间",
       sum(nvl(a.bytes, 0)) / sum(nvl(b.bytes, 0)) * 100 as "剩余百分比"
from (select tablespace_name,file_id,sum(bytes) bytes from dba_free_space group by tablespace_name,file_id
) a
,dba_data_files b
 where b.file_id = a.file_id(+)
 group by b.tablespace_name
 order by b.TABLESPACE_NAME desc

    当然,除了SQL,那么,如果你的远程机器是Win的,且安装了Oracle的客户端,那么就可以使用Oracle自带的 Enterprise Manager Console 工具(打开时会弹出一个Java的一个Fram,但是不用管),最好使用带有DBA权限的用户登录,在存储目录下选择表即可直接查看表空间大小。是不是很直观?哦,对了,用工具和上边的SQL语句的区别是,SQL不会查询出Temp临时表空间,但是工具里面会有。当然你还可以使用这个工具来分配表空间,可干的事很多,在于你是否花时间去干一把。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1138292次
    • 积分:2311
    • 等级:
    • 排名:第16261名
    • 原创:21篇
    • 转载:1篇
    • 译文:0篇
    • 评论:3条