:启动时多次重复查表现象1)抓图2)启动时执行30遍(SQLprofiler监控结果)=2SETFMTONLYOFFexecsp_executesqlN'SELECTSettingName,COALESCE(ValString,'''')(Enabled=1)AND(SettingNode=***@P1)',N'***@P1varchar(200)',''//节点名根据参数变化原因分析1)(SettingNode:string):string;varastr:string;beginastr:=;StandardDaemon_Init(PCHAR(astr));//问题所在Result:=StandardDaemon_GetFunctionSettingVal(PCHAR(SettingNode));end;根源在DLL中执行一次StandardDaemon_GetFunctionSettingVal函数,会产生10次查表语句,其中5次是可以省去,4次是可以优化处理。3)分析:('AND(SettingNode=:SettingNode)');执行后会产生SQL语句,如下所示:=2SETFMTONLYOFF调试方法打开SQLProfiler2)新建跟踪并设置过滤条件并且跟踪结果,如下所示1>选择“事件选择”页签2>选中“显示所有列”并单击“列筛选器”按钮3>过滤掉冰激凌监控4>只监控PEIS数据库5>确定后,运行跟踪6>在源码中打上断点7>运行程序,到断点后观察profiler监控,此时只有2条,程序单步调试后,再观察,如下图所示,会出现大量重复的语句调用。8>整个程序完全启动后,以上重复语句会达到30条之多。4>改进建议1)建议程序只加载一次表查询功能,剩下的过滤等操作可以用filter及filtered属性过滤,这样便可以减少多次访问数据表的操作且可以大大提高执行效率。2)。('AND(SettingNode=:SettingNode)');语句可以使用字符串连接来避免多出来的一句SQL查询语句 s:='SELECTSettingName,'+aVal+'ASVals'+''+'WHERE(Enabled=1)'+'AND(SettingNode='+''''+astr+''''+')';:=s; 3)StandardDaemon_GetHerSetting_Inner多次调用同一个表的解决办法修改函数:思路:利用全局表处理优点:只加载一次,效率提高缺点:实时性差,修改配置后,需要重启软件才能得到结果总结:适用于配置后不常变化的数据集加载implementationusesUFunction;var//Addedby赵建2017-1-1115:06:47g_HerSettingTable:TADOTable;-----------------------------------------------------------------------------------------------------FunctionStandardDaemon_GetHerSetting_Inner(SettingNode:string;SettingField:string):Variant;vari:integer;astr,bstr,aVal:string;s:string;begin//Modifiedby赵建2017-1-1115:08:12//利用临时表优化astr:=SettingNode;bstr:='';tryifnotStandardDaemon_CheckNil('aqPeis',aqPeis)thenexit;withg_HerSettingTabledobegin//空记录集时,则查表并克隆记录集ifEofandbofthe
总台业务软件卡顿分析报告 来自淘豆网m.daumloan.com转载请标明出处.