总台业务软件卡顿分析报告模版Word下载.docx
《总台业务软件卡顿分析报告模版Word下载.docx》由会员分享,可在线阅读,更多相关《总台业务软件卡顿分析报告模版Word下载.docx(8页珍藏版)》请在冰豆网上搜索。
![总台业务软件卡顿分析报告模版Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/15/0c14f913-9833-4cda-a90d-cc03528cc40a/0c14f913-9833-4cda-a90d-cc03528cc40a1.gif)
'
)ASValsFROMdbo.HerSettingWHERE(Enabled=1)AND(SettingNode=P1)
N'
P1varchar(200)'
'
App.User.Code'
//节点名根据参数变化
2、原因分析
1)代码调用
functionTFormBizSet.GetFunctionValFromHerSetting(SettingNode:
string):
string;
var
astr:
begin
astr:
=FormOptions.getADOConnectionByActivePage.ConnectionString;
StandardDaemon_Init(PCHAR(astr));
//问题所在
Result:
=StandardDaemon_GetFunctionSettingVal(PCHAR(SettingNode));
end;
2)根源在DLL中
执行一次StandardDaemon_GetFunctionSettingVal函数,会产生10次查表语句,其中5次是可以省去,4次是可以优化处理。
3)分析:
aqPeis.SQL.Add('
AND(SettingNode=:
SettingNode)'
);
执行后会产生SQL语句,如下所示:
SETFMTONLYON
selectSettingNodefromdbo.HerSettingWHERE1=2
SETFMTONLYOFF
3、调试方法
1)打开SQLProfiler
2)新建跟踪并设置过滤条件并且跟踪结果,如下所示
1>
选择“事件选择”页签
2>
选中“显示所有列”并单击“列筛选器”按钮
3>
过滤掉冰激凌监控
4>
只监控PEIS数据库
5>
确定后,运行跟踪
6>
在源码中打上断点
7>
运行程序,到断点后观察profiler监控,此时只有2条,程序单步调试后,再观察,如下图所示,会出现大量重复的语句调用。
8>
整个程序完全启动后,以上重复语句会达到30条之多。
改进建议
1)建议程序只加载一次表查询功能,剩下的过滤等操作可以用filter及filtered属性过滤,这样便可以减少多次访问数据表的操作且可以大大提高执行效率。
2)将adoquery.sql.add用字符串连接替换。
aqPeis.SQL.Add('
语句可以使用字符串连接来避免多出来的一句SQL查询语句
s:
='
SELECTSettingName,'
+aVal+'
ASVals'
+
'
FROMdbo.HerSetting'
WHERE(Enabled=1)'
AND(SettingNode='
+'
+astr+'
)'
;
aqPeis.SQL.Text:
=s;
3)StandardDaemon_GetHerSetting_Inner多次调用同一个表的解决办法
修改函数:
思路:
利用全局表处理
优点:
只加载一次,效率提高
缺点:
实时性差,修改配置后,需要重启软件才能得到结果
总结:
适用于配置后不常变化的数据集加载
implementation
usesUFunction;
//Addedby建2017-1-1115:
06:
47
g_HerSettingTable:
TADOTable;
-----------------------------------------------------------------------------------------------------
FunctionStandardDaemon_GetHerSetting_Inner(SettingNode:
SettingField:
string):
Variant;
i:
integer;
astr,bstr,aVal:
string;
//Modifiedby建2017-1-1115:
08:
12
//利用临时表优化
=SettingNode;
bstr:
='
try
ifnotStandardDaemon_CheckNil('
aqPeis'
aqPeis)thenexit;
withg_HerSettingTabledo
begin
//空记录集时,则查表并克隆记录集
ifEofandbofthen
ifaqPeis.Activethen
aqPeis.Close;
aqPeis.SQL.Clear;
//查找所有变量字段,连接字段字符串
aVal:
COALESCE(ValString,'
)asValString'
+'
COALESCE(ValEncoded,'
)asValEncoded'
COALESCE(SettingType,'
)asSettingType'
COALESCE(ValInteger,0)asValInteger'
COALESCE(ValBool,0)asValBool'
COALESCE(ValDateTime,0)asValDateTime'
COALESCE(ValMoney,0)asValMoney'
//Modifiedby建2017-1-1014:
32:
45
//优化,减少一条SQL查表语句
s:
SELECTSettingName,SettingNode,'
+aVal+
+
aqPeis.SQL.Text:
=s;
aqPeis.Open;
//克隆表
Clone(aqPeis);
end;
filter:
SettingNode='
+'
+astr+'
;
filtered:
=true;
ifRecordCount>
0then
result:
=FieldByName(SettingField).Value;
end
else
result:
=Null;
except
OnE:
ExceptionDobegin
//'
StandardDaemon_GetHerSetting_Inner错误:
+E.Message;
ifVarIsNull(result)thenbegin
ifSameText(SettingField,'
ValString'
)thenresult:
elseifSameText(SettingField,'
ValEncoded'
SettingType'
ValInteger'
=0
ValBool'
=false
ValDateTime'
=EncodeDate(2001,1,1)
ValMoney'
=0.0;
initialization
CoInitialize(nil);
//ADO需要,USES:
Ole2
This_ID_Depart:
=0;
This_DoLogging:
=true;
07:
17
//建立临时表
g_HerSettingTable:
=TADOTable.Create(nil);
finalization
37
FreeAndNil(g_HerSettingTable);
CoUnInitialize();
建