最近碰到了一些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_"個"
}