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