()where 中很多or ,会导致性能非常差,
这样的语句,程序会按blh,cardno,patid,tjbh,一遍遍找数据。应当改为if else
SELECT a.*
FROM TJ_TJRYK a (nolock), SF_BRXXK b (nolock), YY_DQDMK c ,TJ_TJTDK d
where a.patid = b.patid and b.qxdm *= c.id and a.tdxh=d.xh
and (( @codetype =1 and b.blh = @code)
or (@codetype =2 and b.cardno = @code)
or (@codetype in (3,4) and b.patid = @code1)
or (@codetype =6 and a.tjbh = @code)) --add 20070611
order by a.xh desc
(2)subtring和尽量减少sql语句
--exec usp_mz_ys_gdtxs "00","20080903"--【Ztsql】
CREATE proc usp_mz_ys_gdtxs
@ysdm ut_czyh,
@cxrq ut_rq16
as
/**********
[版本号]4.0.0.0.0
[创建时间]2006.9.25
[作者] ziyun
[版权] Copyright ? 2004-2004上海金仕达-卫宁医疗信息技术有限公司
[描述]门诊医生站主界面医生信息显示内容
[功能说明]
门诊医生站主界面医生信息显示内容
[参数说明]
@Ysdm ut_czyh, --医生代码
@cxrq ut_rq16, --查询日期
@beginrq ut_rq16, --开始时间
@endrq ut_rq16 --结束时间
[返回值]
[结果集、排序]
[调用的sp]
[调用实例]
[修改历史]
**********/
declare @hour varchar(2),@ghlb ut_bz,@ksdm ut_ksdm
select @hour=convert(varchar(2),getdate(),108)
if @hour<='12'
begin
select @ghlb=ghlb,@ksdm=ksdm from GH_GHZDK a(nolock)
where a.ysdm=@ysdm and a.jlzt=0 and a.fzbz>0 and a.ghrq like substring(@cxrq, 1, 8)+ '%'
and substring(a.ghrq,9,2)<='12'
--agg: (1)substring(a.ghrq,9,2)<='12'的性能是非常差的,在这里a.ghrq like substring(@cxrq, 1, 8)+ '%'
-- and substring(a.ghrq,9,2)<='12' 可以改为a.ghrq>= substring(@cxrq, 1, 8) and a.ghrq<
-- =substring(@cxrq, 1, 8)+’12’and a.ghrq>= substring(@cxrq, 1, 8) and a.ghrq>
-- =substring(@cxrq, 1, 8)+’24’,这样才可以很好的用到ghrq索引
-- (2)这里如果会取出多条记录。这样@ghlb不是会多赋值, 是不是可以加top 1。
end
else
begin
select @ghlb=ghlb,@ksdm=ksdm from GH_GHZDK a(nolock)
where a.ysdm=@ysdm and a.jlzt=0 and a.fzbz>0 and a.ghrq like substring(@cxrq, 1, 8)+ '%'
and substring(a.ghrq,9,2)>'12'
end
--agg: substring(a.ghrq,9,2)<='12'的性能是非常差的,在这里a.ghrq like substring(@cxrq, 1, 8)+ '%'
-- and substring(a.ghrq,9,2)<='12' 可以改为a.ghrq>
-- substring(@cxrq, 1, 8)+’12’,这样才可以很好的用到ghrq索引
-- (2)这里如果会取出多条记录。这样@ghlb不是会多赋值, 是不是可以加top 1。
declare @strsql varchar(1000),
@zrc int,@zje ut_money,@wjz int
|
|