存档

文章标签 ‘空间’,文章数:6

统计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 / [...]

在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 [...]

以下存储过程能够统计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论坛上看到有人问,如何获取指定数据库所在磁盘的磁盘剩余空间。 http://topic.csdn.net/u/20100518/16/70cae8d3-a9de-4e45-9f49-fe8b00d8ba74.html?seed=1945596721&r=65529065#r_65529065 解决的思路是:通过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 [...]