最近碰到了一些Caché数据库使用方面的问题。其中一个就是$d在ECP上判断空表慢的问题。之前也碰到过,一直以为是数据库服务器没搞好的原因。这次发现是在清库k了Global之后,如果这个表重来没增加过数据的话,在ECP上执行 $d就会很慢,当然一个命令不会慢的让你有察觉。如果是查工作列表,内部有很多这种判断逻辑就是几十倍的性能差距。推测是Caché库在ECP判断没有过Global的表每次都会去小机再检测,而数据库又没有记住这个事,然后就频繁在ECP和小机直接连接检测,导致性能慢。
测试效果
解决方式
通过测试发现只要表有带D和I的Global就不会慢了。为此可以写SQL把所有表查出来检测,如果没有使用过就补充Global节点。
// 为ECP处理表
// w ##Class(OTH.DealForECP).DealTableForECP()
ClassMethod DealTableForECP()
{
s rset = ##class(%ResultSet).%New()
d rset.Prepare("select TABLE_NAME from information_schema.TABLES WHERE TABLE_SCHEMA='dbo' and TABLE_TYPE ='BASE TABLE'")
s exeret=rset.Execute()
s colCount=rset.GetColumnCount()
s dealNum=0
While(rset.Next())
{
s colField=rset.GetColumnName(1)
s ColValue=rset.GetDataByName(colField)
//替换下划线
s tableName=$tr(ColValue,"_")
i $d(@("^dbo."_tableName_"D"))=0 d
.zw tableName
.s (@("^dbo."_tableName_"D"))=1
.s (@("^dbo."_tableName_"I"))=""
.s dealNum=dealNum+1
}
q "处理:"_dealNum_"个"
}