Caché访问数据库ECP执行空表$d慢分享

最近碰到了一些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_"个"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章