文章
· 一月 22 阅读大约需 2 分钟

如何查询某张数据表占用的磁盘空间?

近期有些小伙伴需要查询某张特定的表所占用的磁盘大小,可能其他小伙伴也有类似的需求。

给大家一个例子供参考。

应当考虑到IRIS的表底层使用global存储数据,包括表数据、索引数据和流数据(如果表中有流属性的话),因此一张表的完整占用应当包含至少上述三种global的求和,如下所示:

Class GlbUtil.GlobalSearch Extends %RegisteredObject
{



ClassMethod GetTableSize(databaseName As %String, tableName As %String) As %Integer [ SqlProc ]

{

set currentNS = $namespace
//在%SYS命名空间中用API获得数据库的文件所在的路径
zn "%SYS"
set bdDirectory = $replace(##Class(Config.Databases).DatabaseByName(databaseName),"^","")

//回到表所在的命名空间,通过API获得表存储数据所用的global名称
zn currentNS

set totalSize = 0
set dataSize = 0
set idxSize = 0
set streamSize = 0
//Data location
set dataGlbName = $replace(##class(%Dictionary.ClassDefinition).%OpenId(tableName).Storages.GetAt(1).DataLocation,"^","")

//计算data global占用的磁盘大小,这里计算的是已经分配给这个global的大小(但不一定占完了),也可以计算实际占用了的大小,可以查询该API获得详情
set sc=##class(%Library.GlobalEdit).GetGlobalSize(bdDirectory,dataGlbName,.dataSize,,1)

//Index location
set idxGlbName = $replace(##class(%Dictionary.ClassDefinition).%OpenId(tableName).Storages.GetAt(1).IndexLocation,"^","")

set sc=##class(%Library.GlobalEdit).GetGlobalSize(bdDirectory,idxGlbName,.idxSize,,1)

//Stream location
set streamGlbName = $replace(##class(%Dictionary.ClassDefinition).%OpenId(tableName).Storages.GetAt(1).StreamLocation,"^","")

set sc=##class(%Library.GlobalEdit).GetGlobalSize(bdDirectory,streamGlbName,.streamSize,,1)

//求和返回
set totalSize = dataSize + idxSize + streamSize

Quit totalSize

}



}

上述代码定义了一个SQL函数,可以通过SQL直接查询,效果如下:

其中,HCC为表所在的数据库,Test.Test是测试用的数据表。返回的结果统计单位是MB。

读者可以在这个demo基础上添加些自己需要的其他特性和异常处理。现在这个函数返回的是系统分配给表的占用(不一定真用完了),读者可以参考在线文档中的API说明,获得更多详细的信息,例如要获取实际占用的空间而不是已分配的空间,应该如何调用API等。

讨论 (0)1
登录或注册以继续