如何查询某张数据表占用的磁盘空间?
近期有些小伙伴需要查询某张特定的表所占用的磁盘大小,可能其他小伙伴也有类似的需求。
给大家一个例子供参考。
应当考虑到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 = 0set dataSize = 0set idxSize = 0set streamSize = 0//Data locationset 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 locationset idxGlbName = $replace(##class(%Dictionary.ClassDefinition).%OpenId(tableName).Storages.GetAt(1).IndexLocation,"^","")
set sc=##class(%Library.GlobalEdit).GetGlobalSize(bdDirectory,idxGlbName,.idxSize,,1)
//Stream locationset 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直接查询,效果如下:
.png)
其中,HCC为表所在的数据库,Test.Test是测试用的数据表。返回的结果统计单位是MB。
读者可以在这个demo基础上添加些自己需要的其他特性和异常处理。现在这个函数返回的是系统分配给表的占用(不一定真用完了),读者可以参考在线文档中的API说明,获得更多详细的信息,例如要获取实际占用的空间而不是已分配的空间,应该如何调用API等。