数据库优化-like语句
ERP软件:浪潮gs5测试版
问题:
在岗位授权,点击数据权限授权的时候提示:timeout server is not responding
测试环境:
4核cpu 2g内存 win2000sp4+sql2000sp4 34个实例(数据库) 同时使用系统的用户大概有20人
出现问题的实例有4-5个.
分析问题:
通过跟踪发现是存储过程SP_GSP_GetBizObject执行的时候大概使用了30秒.
说了半天废话,我们先看看存储过程吧.
create procedure SP_GSP_GetBizObject
(
@ownerid char(36)
)
as
select ID,CODE,PATH,LAYER,ISDETAIL,NAME,DESCRIPTION,PROFILE,SYSINIT,DATAMODELID from GSPBIzObject,
(
select distinct ID refID from GSPBizObject,
(
select Path as RefPath from GSPBizObject,
(
select distinct BizObjId RefBizObjID from GSPBizObjectOP,
(
select distinct BizOPID RefBizOpID from GSPROLEAss,
(
select distinct roleid RefRoleID from
(
select roleid from GSPPOSASS where positionid = @ownerid
) roles
) RoleSet
where roleID = RefRoleID
) BizOPIdSet
where ID = RefBizOpID
) BizObjectIDSet
where id = RefBizObjID and HasAuAssign = '1'
) RefBizObjIDSet
where RefPath LIKE PATH + '%' /*这条语句在效率上有问题*/
)RefIDSet
where ID=refID
order by PATH
分析发现,时间浪费在条件:where RefPath LIKE PATH + '%'
直接去掉like条件,执行时间是2秒而使用like执行时间是28秒.
那么我们考虑修改like条件,找一个等价的语句吧.
利用sql server自带的函数解决.如下:
where Path = left(refpath,len(Path))
解决方法:
修改储存过程使用条件where Path = left(refpath,len(Path))执行时间是2秒.
建议我们的存储过程尽量不要使用like语句.这样程序的执行效率很低.