存档
统计Sybase ASE数据库的数据段和日志段的剩余空间以及剩余率。以下SQL在ASE12.5.1及以上版本通过测试。
select convert(char(16),db_name(data_segment.dbid)) DBName
,str(round(total_data_pages / ((1024.0 * 1024) / @@maxpagesize),2),10,2) "Total Data(MB)"
,str(round(free_data_pages / ((1024.0 * 1024) / @@maxpagesize),2),10,2) "Free Data(MB)"
,str(round(total_log_pages / ((1024.0 * 1024) / @@maxpagesize),2),10,2) "Total Log(MB)"
,str(round(free_log_pages / ((1024.0 * 1024) / @@maxpagesize),2),10,2) "Free Log(MB)"
,str( round(100.0 * free_data_pages / total_data_pages ,2),10,2) "Free_Data%"
,str( round(100.0 * free_log_pages / total_log_pages,2),10,2) "Free_Log%"
from
(select dbid,sum(size) total_log_pages,lct_admin("logsegment_freepages", dbid ) free_log_pages
from master.dbo.sysusages
where segmap & 4 = 4
group by dbid
) log_segment
,
(select dbid,sum(size) total_data_pages ,sum(curunreservedpgs(dbid, lstart, unreservedpgs)) free_data_pages
from master.dbo.sysusages
where segmap <> 4
group by dbid
) data_segment
where data_segment.dbid = log_segment.dbid
--and data_segment.dbid > 3 and data_segment.dbid < 31513
order by data_segment.dbid
go
在ASE15.x之前的所有版本中(包括ASE12.5.4),存储过程sp_helpdevcie无法显示设备的剩余空间以及设备上各个数据库的具体分配情况。
比如:在ASE12.5中,执行sp_helpdevice master的结果为:
1> sp_helpdevice master
2> go
device_name physical_name
description
status cntrltype device_number
low
high
----------------------------------------------------------------------------------------------------------------
master e:\sybase125\data\master.dat
special, dsync on, default disk, physical disk, 100.00 MB
3 0 0
0
51199(1 row affected)
(return status = 0)
上面输出结果中加粗标记出来的100.00MB表示master设备的总大小。至于master设备还剩余多少空间?master设备都分配给哪些数据库使用了?ASE15.x之前版本的存储过程sp_helpdevice不能给出答案。
在公司测试环境上执行sp_spaceused时报error:1151的错误。虽然这不是一个严重的错误,记得好像以前也出现过一次,故记录一下。
1> sp_spaceused
2> go
database_name
database_size
----------------------------------------------------
----------------------------------------------------
ultranms
600.0 MB(1 row affected)
Msg 1151, Level 11, State 1:
Server 'ASE', Procedure 'sp_spaceused', Line 308:
Object 460577698 passed to OAM builtin function no longer exists in database 5.
Msg 1151, Level 11, State 1:
Server 'ASE', Procedure 'sp_spaceused', Line 308:
Object 460577698 passed to OAM builtin function no longer exists in database 5.
Msg 1151, Level 11, State 1:
Server 'ASE', Procedure 'sp_spaceused', Line 308:
Object 460577698 passed to OAM builtin function no longer exists in database 5.
Msg 1151, Level 11, State 1:
Server 'ASE', Procedure 'sp_spaceused', Line 308:
Object 460577698 passed to OAM builtin function no longer exists in database 5.
reserved data
index_size unused
-------------------------------- ----------------------------
---------------------------------------- ----------------------------
9020 KB 1396 KB
1064 KB 6560 KB
(return status = 0)
出现错误1151的原因是:执行sp_spaceused统计数据库的空间使用情况的时候,其它会话正在执行删除表的操作。
在上一篇文章中,查看表中列属性的SQL语句
查看Oracle中表的简要列属性信息。利用上面的SQL语句,可以改进出来统计表所占物理存储空间大小的语句。
在Oracle中number数字类型所占的空间,计算公式为:
number(p,s) 占用的字节数为: floor( ( p + 1 ) / 2 ) + 1
select object_name,sum(decode(data_type,'NUMBER',floor((col_length+1)/2) + 1,col_length)) table_size
from
(select object_name,column_name,data_type,decode(data_precision,NULL,data_length,data_precision) col_length
from
(select o.name object_name,c.column_name column_name,c.data_type,c.data_length,c.data_precision,c.data_scale
from sys.tab$ t,dba_tab_cols c,sys.obj$ o,sys.user$ u
where o.obj#=t.obj#
and o.name=c.table_name
and c.owner=u.name
and o.owner#=u.user#
and u.name='SCOTT'
/*and o.name='EMP'*/
) tab_cols
) col_len
group by object_name;
上面的SQL语句统计用户scott的所有表占用的物理空间的字节数。
————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:oracle table storage 表字段 占用空间大小
————————————————————————————————-
以下存储过程能够统计sqlserver数据库内所有用户表所占用的空间,并按照占用空间大小倒序排列。
--------------------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE GetAllTableSizes
AS
DECLARE @TableName VARCHAR(100)
DECLARE tableCursor CURSOR FORWARD_ONLY
FOR
select [name] from dbo.sysobjects
where OBJECTPROPERTY(id, N'IsUserTable') = 1
FOR READ ONLY
CREATE TABLE #TempTable
(
tableName varchar(100),
numberofRows varchar(100),
reservedSize varchar(50),
dataSize varchar(50),
indexSize varchar(50),
unusedSize varchar(50)
在csdn论坛上看到有人问,如何获取指定数据库所在磁盘的磁盘剩余空间。
解决的思路是:通过sysfiles系统表找到数据库所属数据文件所在的物理路径,从数据文件的物理路径中提取所在磁盘盘符(第一个字母),最后用扩展存储过程xp_fixeddrives来获得磁盘驱动器的剩余空间(MB Bytes)。
SQL语句如下:
declare @drivename char(1)
select @drivename=left(filename,1) from sysfiles where fileid= 1
if not exists(select 1 from tempdb.dbo.sysobjects where name like '#FreeSpace%' and type='U')
create table #FreeSpace(
Drive char(1),
MB_Free int
)
else
truncate table #FreeSpace
insert into #FreeSpace
exec xp_fixeddrives
select MB_Free from #FreeSpace where Drive = @drivename
go
我的测试环境是的结果如下:
1> declare @drivename char(1)
2> select @drivename=left(filename,1) from sysfiles where fileid= 1
3>
4> if not exists(select 1 from tempdb.dbo.sysobjects where name like '#FreeSpace
%' and type='U')
5> create table #FreeSpace(
6> Drive char(1),
7> MB_Free int
8> )
9> else
10> truncate table #FreeSpace
11>
12> insert into #FreeSpace
13> exec xp_fixeddrives
14>
15> select MB_Free from #FreeSpace where Drive = @drivename
16> go(3 行受影响)
MB_Free
-----------
18905(1 行受影响)
1>
2>
3> select filename from sysfiles
4> go
filename--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------
D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\master.mdfD:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\mastlog.ldf
(2 行受影响)
1> xp_fixeddrives
2> go
drive MB 可用空间
----- -----------
C 26562
D 18905
E 22517(3 行受影响)
上面的sql语句和csdn上帖子的发帖人要求的有点差距,
第一:指定数据库,这点很容易。直接select filename from <your_db_name>.dbo.sysfiles即可。
第二:某个数据库的数据文件可能跨越两个及以上不同的物理磁盘;所以@drivename变量有可能得到不唯一的值。可以考虑用游标来实现。
————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:sqlcmd sqlserver2005 sysfiles xp_fixeddrives 磁盘剩余空间
————————————————————————————————-