第一篇:性能优化组日常工作开展详细说明书1230
性能优化组工作开展详细说明书
1)坏小区跟踪处理说明
责任人:
义乌片区:东永片区:金华片区:取数路径:坏小区处理包括日常处理和每周重点工作 日常处理门限定义:
高掉线小区:全天掉线次数>150次,无线掉线率>1% RRC建立成功率低小区:全天RRC连接建立失败次数>150次,RRC连接建立成功率<98% 切换差小区:全天切换失败次数>150次,切换成功率<90% 必须处理门限定义: 根据省公司的派单门限
高掉线小区:每小时初始上下文建立成功次数>50次,无线掉线率>10% RRC建立成功率低小区:每小时RRC请求次数>50次,RRC连接建立成功率<80% 性能监控组每天都会对每小时进入派单门限的小区进行处理,处理不了的将转交给性能优化组各片区负责人,请各位做好记录。坏小区处理一般流程:
1、查看指标:先确定当前指标是否恢复,是否为极个别小时的恶化引起的;查看历史情况确定突发点的时间,查看历史告警和当前告警
2、查看告警:若当前有告警的话,先和网管确认该告警对指标是否有影响,若有的,和网管配合做好问题定位,按紧急程度大小推动代维(In Service)或排障组(Maintenance)处理;若当前无告警,核查硬件(网管)和参数(王鑫炎、数据组)是否正常。
3、调整参数:在MapInfo和Google地图上查看站点的情况,是否为无线环境较差导致,结合Snapshot是否需要调整下参数,参数修改后至少要一天评估对比,若连续两天参数修改后指标有改善则可以闭环,若指标恶化及时回退参数;若参数修改无效进入延伸测试环节
4、延伸测试:在查看好指标,排查完告警后,修改参数未果的情况下,室内站点转到延伸,室外站点转到现场测试,根据现场测试反馈的结果再重新排查或者挂起 问题分类:
1、覆盖问题:因覆盖引起的指标较差,无线环境较差包括高速、铁路以及其他边远地区
2、参数问题:参数设置不当或配置错误,不包括弱覆盖中对参数的微调
3、硬件问题:硬件故障,告警,隐形故障等;若告警不影响指标划分到其他几项问题
4、干扰问题:网内、网外干扰,判断依据是上行干扰值或实时RSSI较高
5、系统问题:站点吊死、过载等,对于自动恢复、查不清原因的小区放到未知问题这一块
6、延伸问题:参数修改无效,硬件排查无故障的室分站点(E频段),需要延伸处理
7、其他问题:其他、用户行为相关、未知等问题
主要处理方法:
1、硬件重启:站点重启,包括性能监控重启后恢复的站点
2、参数调整:参数核查、修改、回退等
3、开通站点:对应覆盖问题,需要优先开通站点
4、规划站点:对应覆盖问题,需要规划新的站点
5、故障排查:硬件故障、干扰、工程问题等的排查
6、现场测试:参数修改无效,硬件排查无故障的宏站(D、F频段)
7、延伸处理:针对延伸问题,8、其他:自动恢复、找不出有什么工程操作的、用户行为相关、挂起等 闭环定义:
非突发小区:连续两天及以上时间指标正常 突发小区:最新的24小时及以上指标正常
2)区域性干扰问题
取数路径:NPO、PMS、SAM 处理原则:
某一县市区域指标突然恶化(主要为RRC建立成功率),指标下降约0.3个百分点以上。恶化原因非个别小区吊死导致,同时单时段出现大量RRC建立失败次数在100次以上且RRC建立成功率不足90% 的小区,如果上述小区上行干扰统计大于-120dBm且地理位置相对集中,同时恶化区域内多个站点RSSI高于-80dBm且地理位置集中,则可判断为区域性干扰。主要处理方法:
1、依据指标恶化程度和实时RSSI强弱逐步锁定干扰区域及干扰中心区域(RSSI最强)
2、依据干扰开始时间和地理位置优先判断是否为干扰仪干扰(如周末学校站点)
3、对干扰中心区域站点逐一闭锁查看干扰是否消失,若干扰消失,则需对闭锁的站点进行工程排障和参数核查,最终确定干扰产生原因
4、若闭锁干扰中心站点干扰未消失,则需对干扰区域进行扫频,以确定干扰源
3)RRC建立成功率
取数路径:NPO、PMS 指标定义:
RRC连接建立成功次数/ RRC连接建立请求次数 处理原则:
全天RRC连接建立失败次数>150次,RRC连接建立成功率<98% 主要处理方法:
1、确认是否全网指标恶化,例如大面积退服、脱管、传输断链等;另外若现场做过一些操作需了解到位,例如在某一片区域进行参数修改试验导致RRC指标恶化,则需及时回退。
2、需要寻找 TOP 站点,查看是哪些部分站点指标恶化拖累全网指标,一般情况下出现这种站点基本上都是吊死,重启恢复
(1)、排查干扰,看站点是否集中以及实时RSSI,一般情况下若出现区域性干扰,那么该区域的掉线率,RRC建立成功率都是很低的,校区站点出现干扰要结合时间点来判断,若干扰时间有规律,那么可以确定是干扰器导致,这类会自动恢复
(2)、最大用户数是否大于200,这类问题在扩容后已经减少,除了大型集会活动外一般不常见
(3)、是否有突发吊死,即单个站点或者小区RRC建立成功率较低且失败次数较多,重启后观察,并查看其具体是在哪个信令流程中失败(MSG1-MSG5),收取相应trace分析
(4)、隐性故障导致,查看告警:查看RRC恶化时间点与该基站出现的告警是否大致相近,若相近则优先考虑处理该告警;若无告警,则需要观察几小时,若RRC建立成功率都是相当低的,同时重启无效的,那很有可能是隐性硬件问题需联系排障、代维上站检查设备(RRU、BBU等等)
(5)、弱覆盖
(6)、检查或调整参数设置(尤为注意边界、孤岛小区)
3、收取CallTrace分析
4)掉线率
取数路径:NPO、PMS 指标定义:
(eNB请求释放上下文数-正常的eNB 请求释放上下文数)/初始上下文建立成功次数 处理原则:
全天掉线次数>150次,无线掉线率>1% 主要处理方法:
1、首先排查覆盖问题,可根据历史指标判断,如果指标在某个时段突发变差,大致可以排除覆盖问题,如果指标一直很差,需要根据MR报告判别覆盖问题。
2、如果不是覆盖问题,排查干扰、突发问题,若是干扰导致,按干扰流程处理;若不是,提取TOP小区,分析主要掉线原因(RLF、RIF、IF等),对历史 KPI 分析,如果指标是某天开始恶化的,则核对改时间点前后的告警和数据配置变化,先排查硬件是否存在问题,如果有的话及时进行排障或联系代维,排除硬件问题后核查指标恶化点前后参数配置上的变化,是否调整过某个参数以及对邻区进行核查,存不存在邻区漏配情况。
3、如果一切都没有问题,收取CallTrace分析,通过后台信令排查掉话原因。
5)切换成功率
取数路径:NPO、PMS 指标定义:
切换成功次数/切换请求次数 处理原则:
切换差小区:全天切换失败次数>150次,切换成功率<90% 主要处理方法:
1、排查干扰、突发问题
2、了解切换每个步骤,小区切换时分为切出SRC和切入TGT,不论小区作为SRC或TGT都分ENB内切换、X2切换、S1切换三个切换类型,每个切换类型又分为准备Prep和执行Exec两个阶段,切换失败的原因又分为Abort(链路故障或其他原因)和WithoutAbort(TGT小区定时器超时)。核查邻区是否漏配,在MapInfo上查找站点以及周边站点,结合NPO上的指标分析切换失败出现在哪个步骤,找出故障和吊死站点。
3、对比分析源和目标基站配置数据和告警数据,对于找出的差异之处和CallTrace进行联合分析,如果可以找到差异参数影响,回退参数进行验证。
第二篇:产品技术性能说明书
产品技术性能说明书
一、硅镁加气空心轻质隔墙板:本产品是一种作建筑隔墙板用的硅镁加气空心轻质材料,是以氯氧镁水泥为胶结材料,以无机或有机纤维为增强材料,加适量活性硅质材料,加水配成料浆,并引入空气,浇注入具有模芯的模具中,成型为泡沫和空心结构的轻质高强建筑隔墙板,是我国目前容重最轻,比强度最高的轻质隔墙板,使用本产品为设计和施工带来极大的便利,能有效的降低大型高层建筑的自重和载面。
二、硅镁加气混凝土轻质隔墙板的突出优势(1)技术性能指标高、功能全
重量更轻、强度更高、抗压抗折、耐酸碱、保温隔热、隔声、防火、防水、抗震、环保、节能。(2)可加工性强,施工快捷高效
硅镁加气混凝土轻质隔墙板具有可锯、可钉、可刨、可钻、可粘贴、可重复使用的特点;大块件组合安装,建筑施工快速、便捷,可提高劳动率30%以上。
(3)劳动强度低,极大降低建筑施工成本
产品轻质、大块件,可提高工作效率3-5倍,大大降低劳动强度和建筑施工成本。
(4)建筑荷载小、造价更低
由于重量轻,同等墙体面积仅是490mm墙砖混结构重量的1/15,可大大降低建筑结构纵向荷载,从而减少肥梁胖柱、减少钢筋混凝土的使用,显著降低工程整体造价。(5)扩大使用面积
在满足建筑各项指标的前提下,相同建筑面积可增加使用面积10%-22%。
(6)防火性能达到国家A级标准,产品属不燃体。(7)节能性能优越
采用硅镁加气混凝土轻质隔墙板为分户墙的隔音、隔热、保温材料,为节能建筑保温体系提供了一个全新的外保温系统;为分户隔墙提供了一种既保温隔热又隔声的分户隔墙新产品,可满足更高建筑节能要求。
(8)环保性能优越
建筑、装饰材料中大多含有甲醛、苯等严重危害人体健康的有毒有害物质。我厂生产的硅镁加气混凝土轻质隔墙板经有关建筑材料测试中心检测,各项环保指标全部符合国家标准。
三、硅镁加气混凝土轻质隔墙板主要技术性能指标 规格型号 KGB 300×60×9㎝
序号 检验项目 检验方法 标准指标 检验值 1 抗冲击性能 次 JC680-1997≥3 无贯穿裂缝 2 抗弯破坏荷载 板自重倍数 JC680-1997≥1.5 4.55 3 面密度 ㎏/㎡ JC680-1997≤50 42.4 4 燃烧性能 JC680-1997 不燃 5 干燥收缩值 mm/m JC680-1997≤0.8 0.44 6 吊挂力 N JC680-1997≥800 1000 7 空气声隔声量 dB JC680-1997≥35 40
四、产品板型和规格
分室,分户隔墙板:
长度为: 2800 mm、3000 mm 亦可根据客户要求定型加工;
宽度为: 600mm 厚度为: 60mm、90mm、120mm
五、应用方案
我公司为客户提供完整的建筑施工图集,并可为客户提供基于本建筑墙体材料的建筑设计的整体解决方案。
第三篇:技术组日常工作
技术组日常工作
1、报表
检待修井:区队上报各自检待修井(附产量、功图),技术组分析判断后整理,早上8:00之前报调度和通井工段,并与通井工段沟通,派车检修
排量:区队上报各自技措井、二压井、新井、恢复井、事故处理井产量,技术组整理,早上8:00之前报大队统计处,同时了解技措井等产能和动态情况
晚报表:技术组每晚20:30之前向调度和大队统计处上报当天落实情况
2、考勤
早上8:00之前技术组向调度上报技术员考勤情况
3、油井动态
至少每月跟区队对接一次油井动态
4、设计
通井车上车前技术组出设计、安全技术交底,作业完后技术组视频审查,收设计、交底单、工单、作业总结
5、现场监督
技术员对上车检修井、技措井、二压井、恢复井、事故处理井必须现场监督,严把质量和技术关
6、熔蜡
每月选40-50口结蜡严重、结蜡周期短的油井与通井工段沟通进行熔蜡(目前我们只有自能热洗车一部)
7、功图测试
目前技术组技术员人员较少,在不影响技术组正常日常工作的前提下,要求技术员每月测试一定数量的功图
8、巡井
每月二次巡井,重点是检修过的油井,并要求有记录
9、含水化验
技术组每月随机抽选各区队5-10油井,让区队取样送到技术组,技术组化验含水情况,并与数据库对比,化验完后在调度群里公示
10、停井恢复
每年技术组都会选10--20口停躺井进行恢复,(分析周边相邻油井产量、注水受益情况、油井自身资料进行分析,总结出最简单有效的方法进行恢复)
11、学习
要求技术员自觉学习,不断增长知识,同时提高自身素养
12、培训
每月对技术员进行至少二次以上的安全、技术等方面的培训,并要有培训记录
13、资料整理
这是一个长期而漫长的工作(各类资料的统计、新资料的收集、已有的资料分类)
14、采油工程月报 每月初向研究所传采油工程月报
15、数据库
每月上传月度数据、油井检修管柱数据
16、卫生区
技术员每天8点左右打扫大队院子
17、其它方面
要求技术员要自律、自爱
第四篇:SQL语句性能优化
我也做了很长时间医疗软件,也写过不少sql优化,没有详细记录下来,个人感觉下面转载的更符合医院医疗软件实际业务,很认可大部分所写的原则,固转载过来,以作借鉴。软件的根本还是在于更细更精,在于从客户的实际使用考虑问题。
性能优化原则1:永远避免困境
利用缓存把字典数据取到中间服务器或是客户端替代直接sql查询,如,门诊医生站把字典下载到客户端,减少执行次数。
一次性取数据到客户端,然后再逐条处理,而不是分次取数据,处理好一条数据再取下一条再处理。例:门诊收费取hjcfmxk例子,原来是一张处方条明细都查询一次,查询后再处理,现改为一次把所有明细都取过来,然后一条条处理
尽量减少光标,看能不能用临时表
性能优化原则2:kiss原则
对于where 条件中的左边可以利用索引的字段Keep it simple stupid,左边尽量避免用函数(substring,isnull,upper,lower),参加计算+,-*/
例子1:select * from ZY_BRFYMXK where substring(zxrq,1,8)='20081212‘
select * from ZY_BRFYMXK where zxrq between '2008121200' and '2008121224' 例子2:
select * from zy_detail_charge where SUBSTRING(patient_id,1,10)=
substring('000005090600',1,10)这句耗时30秒以上
select * from zy_detail_charge where patient_id like substring('000005090600',1,10)+'%' 这句耗时2秒以内
性能优化原则3:尽可能利用到索引
例:select * from ZY_BRFYMXK a(nolock),VW_LSYZK b(nolock)where a.syxh=3 and a.yzxh=b.xh and a.fylb=0
select * from ZY_BRFYMXK a(nolock),VW_LSYZK b(nolock)where a.syxh=3 and a.yzxh=b.xh and a.fylb=0 and b.syxh=3
性能优化原则4:or,避而远之
对于索引字段尽力避免用or,普通字段可以用or,解决要么分解成多个sql,要么用业务规则避免,例:declare @rq1 ut_rq16,@syxh ut_syxh
select @rq1='20081201'
select @syxh=157
性能优化原则5:避免大批量数据取到前台
例: select * from ZY_BRSYK cyrq between ‘20080901’ and ‘20081201‘,对于大医院每天100多人,90天是9000条数据
性能优化原则6:事务,尽可能的短吧
所有计算、对临时表的更新都应但放在事务外,事务中最好只有更新和插入正式表操作.因为事务中产生的锁只有在commit tran是才会释放。
性能优化原则7:热表,留在最后吧
热表是频繁调用的表。如:sf_mzcfk,zy_brfymxk,bq_fyqqk.对于热表尽量放在事务最后:这样锁的时间短。大家都坚持这样,死锁的可能性就小。如果都是热表各个存储过程更新表的顺序应当一样这样可以避免死锁
性能优化原则8:创建临时表一定要避免在事务中作
如create #tempXX(…)
Select * into #tempXX from …
因为创建临时表会锁tempdb的系统表
例:生成#temp1放在事务内外,用sp_lock2 ‘’观察结果
if object_id('tempdb..#temp1','U')is not null
drop table #temp1
begin tran
select * into #temp1 from ZY_BRSYK where ryrq>'20080901‘
select * from #temp1
waitfor delay '00:00:10'
commit
性能优化原则9:大的报表查询避免与正常业务碰撞
如果没有查询服务器,那要在存储过程中限制不能操作加上如:
declare @rq1 ut_rq16,@rq2 ut_rq16,@now ut_rq16
select @rq1=convert(varchar(8),getdate(),112)+'08:00:00'
select @rq1=convert(varchar(8),getdate(),112)+'11:30:00'
select @now=convert(char(8),getdate(),112)+convert(char(8),getdate(),8)
if @now>@rq1 and @now<@rq2
begin
select '上午繁忙时间段不能作此查询'
return
end
性能优化原则10:存储过程避免大的if…else…
这个常出项在业务相同表不同的存储过程中,因为这样常到if …else …原来医技接口中很多这种存储过程,当时把门诊住院业务放在一个存储过程中。这样最大的问题是sql server会根据sql语句来compile存储,这个过程会生成优化计划,决定用那个索引。如果存储过程用到门诊表compile一下,到用到住院表是发现不对,又会compile一下,这样不停compile.compile很号时间要1-2秒,而且一个存储过成在compile是,所有调用这个存储过程的进程都要在排队等候,因为他会独占锁这个存储过程
例:usp_yjjk_getwzxxm_old.sql,后改为:
usp_yjjk_getwzxxm.sql, usp_yjjk_getwzxxm_mz.sql,usp_yjjk_getwzxxm_zy.sql
性能优化原则11:进攻是最好的防守
在普通编程语句对于数据校验总是用防守办法先判断,后再作相应处理。而在sql中先处理再判断性能会好很多。
--更新药品库存。
If exists(select 1 from YK_YKZKC WHERE idm=100 and kcsl>50)
begin
update YK_YKZKC set kcsl=kcsl-50 where idm=100
End
Else begin
rollback tran
Select ‘F库存不够’
return
end
--改为
update YK_YKZKC set kcsl=kcsl-50 where idm=100 and kcsl>50
If @@rowcount<=0
Begin
Rollbakc tran
Select ‘F库存不够’
end
--取未执行的医技项目,日表没有数据就到年表中查找
if exists(select a.* from SF_MZCFK a(nolock),SF_CFMXK b(nolock)
begin
select a.* into #temp1 from SF_MZCFK a(nolock),SF_CFMXK b(nolock)
end
else begin
select a.* into #temp1 from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)
end
--改为
Insert into #temp1 select a.*
from SF_MZCFK a(nolock),SF_CFMXK b(nolock)
If @@rowcount=0
Begin
Insert into #temp1 select a.*
from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)
end
性能优化原则12:trig最后的手段
Trig(触发器)的处理的处理机制是满足条件时就会在源语句后面加上trig中的代码进行执行。
它有两个致命的弊端:(1)不清楚有trig的人会对于执行结果感到迷惑。如常有在插入一张表如果主键是indentity的值常取用select @@identity。但如是有trig,tring中有表插入操作,这时的@@identity可能就不是想要的值。(2)trig会束缚选择。如:有一套单据主表和明细表,当明细表的金额更新时,要同步主表的金额,当程序是一条条更新明细时用trig的作法是每当更新一条明细记录时都算一处所有明细表的总金额,再去更新主表的金额。这样有多少条明细就要算多少次,好的作法是不要trig,直接在sql语句中明细更新完明后,一次性算出总金额每条单据的总金额,再更新主表的金额。
对于trig如果有其他手段就一定要避免用trig.性能优化原则13:用户说好才是真的好
1)有时sql语句性能难以优化,但用户对于系统响应速度还是不满意。这时可以从业务分析处理。
如:我们退费模块录入发票号原来是用fph like ‘XXX%’。用户报怨慢,后来改为先用fph=‘XXX’来查,如查不到再fph like ‘XXX%’。这样在绝大部情况下速度都非常快,同时也满足小部分情况下模糊查询的需求。
如:我们的程序要查日表和年表。如果通过日表union表视图去查会非常慢,性能也难以优化。程序改为普通情况下不查年表,用户勾上年表标志时才查年表。
(2)查询统计很多数据时间比较长,就以查询完一部分数据后可以显示这部分数据或是用提示,这样用户清楚系统在作事情也知道大概进度。这样情绪上会好很多。
(3)查询模块常有一进入时也默认一个查询,如果性能好,查询又合用户心意,这种设计非常好,如果性能不好,那就不是好的设计。用户对于进入都困难的模块是没有好感的。
(4)有户的耐心与查询出的记录成正比。用户痛恨等待很久却没有查询出记录。
对于非常慢的查询,如果有些子查询非常快可以先作这样查询以避免查询很久却没有数据出来的情况。如:按病历号查在院病人所有费有明细,可以先查一下这个病历是不是有对应病人。
实战技巧1:用exists、in代替distinct
Distinct实际上是先收集再删除这样两步都耗资源。
Exists,in会隐式过滤掉重复的记录
例查自2009年以来有金额大于100的药品的病人
select distinct a.blh,a.hzxm from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock)where a.patid=b.patid and b.syxh=c.syxh and c.zxrq>'2009' and c.zje>100--改为
select a.blh,a.hzxm from ZY_BRXXK a where exists(select 1 from ZY_BRSYK
b(nolock),ZY_BRFYMXK c(nolock)where a.patid=b.patid and b.syxh=c.syxh and
c.zxrq>'2009'and c.zje>100)
实战技巧2:缩短union
select …from A,B,C,D,E1
where(E1的条件)
and(其他表联接条件)
union
select …from A,B,C,D,E2
where(E2的条件)
and(其他表接接条件)
改为
select …from A,B,C,D,(select...from E1where(E1条件)
union
select …from E2where(E2条件))E where(其他条件)
当涉及ABCD表部分耗资源而E1,E2不耗资源时是这样,如果反过来则改后的性能不一定好。查2009年4月后入院的在院病人在2905病区发生的所有费用明细
select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw
select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw
from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YK_YPCDMLK d where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.idm=d.idm
union all
select a.hzxm,b.cyrq,d.name,d.xmgg,c.ypsl/c.dwxs ypsl, c.ypdw
from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YY_SFXXMK d where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.ypdm=d.id and c.idm=0
--改为
select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw
from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),(select ypmc,ypgg,ypdm,idm idm from YK_YPCDMLK union select name,xmgg,id,0 from YY_SFXXMK)d
where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.idm=d.idm and c.ypdm=d.ypdm
实战技巧3:合并sql
把表和where条件类似的两个或是多个sql合并为一个sql.--查2009年以后的普通、急诊、专家挂号人数
declare @ptghs int,@jzghs int,@zjghs int
select @ptghs=0,@jzghs=0,@zjghs=0
select @ptghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=0
select @jzghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=1
select @zjghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=2
select @ptghs,@jzghs,@zjghs
--改为
select @ptghs=0,@jzghs=0,@zjghs=0
select @ptghs=sum(case when ghlb=0 then 1 else 0 end),@jzghs=sum(case when ghlb=1 then 1 else 0 end), @zjghs=sum(case when ghlb=2 then 1 else 0 end)
from GH_GHZDK where ghrq>'2009'
select @ptghs,@jzghs,@zjghs
实战技巧4:去掉游标
把游标当作编程语言的for,do---while的方式,很多情况下都可以去掉,如果光标中间sql语句只有一条一般都是可以去掉光标改为一句sql。
--查当天出院出院日期在2009年4月1到9日间病人的zfdj,zfje置为0
declare @syxh ut_syxh
declare cur1 cursor for select syxh from ZY_BRSYK where cyrq>='20090401' and cyrq<'20090410'
open cur1
fetch cur1 into @syxh
while @@fetch_status=0
begin
fetch cur1 into @syxh
end
close cur1
deallocate cur1
--改为
update ZY_BRFYMXK set zfdj=0,zfje=0
from ZY_BRFYMXK a,ZY_BRSYK b
where a.syxh=b.syxh and b.cyrq>='20090401' and b.cyrq<'20090410'
实战技巧5:取代count
利用内部函数代替
declare @count int
select * into #tmep1 from ZY_BRFYMXK WHERE zxrq>'200901'
select @count=@@rowcount—可以得到count值
select @count
select @count=count(*)from #tmep1—可以被取代
select @count
利用exists而不count判断有没有记录
declare @count int
Select @count=count(1)from ZY_BRFYMXK WHERE zxrq>'2009‘
If @count>0 … else ….--改为
If exists(Select 1 from ZY_BRFYMXK WHERE zxrq>'2009’)… else ….
第五篇:网站前端性能优化总结
一、服务器侧优化
1.添加 Expires 或 Cache-Control 信息头
某些经常使用到、并且不会经常做改动的图片(banner、logo等等)、静态文件(登录首页、说明文档等)可以设置较长的有效期(expiration date),这些HTTP头向客户端表明了文档的有效性和持久性。如果有缓存,文档就可以从缓存(除已经过期)而不是从服务器读取。接着,客户端考察缓存中的副本,看看是否过期或者失效,以决定是否必须从服务器获得更新。
各个容器都有针对的方案,,以 Apache 为例:
ExpiresActive On ExpiresByType image/gif “access plus 1 weeks”
表示gif文件缓存一周,配置可以根据具体的业务进行调整,具体配置可以参考:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_expires.html
2.压缩内容
对于绝大多数站点,这都是必要的一步,能有效减轻网络流量压力。
表示zlib在压缩时可以最大程度的使用内存,压缩html、文本、xml和php这几种类型的文件,指定扩展名为html、htm、xml、php、css和js的文件启用压缩。
具体配置可以参考:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_deflate.html
3.设置 Etags
在使用etags之前,有必要复习一下 RFC2068 中规定的返回值 200 和 304 的含义:
200--OK 304--Not Modified
客户端在请求一份文件的时候,服务端会检查客户端是否存在该文件,如果客户端不存在该文件,则下载该文件并返回200;如果客户端存在该文件并且该文件在规定期限内没有被修改(Inode,MTime和Size),则服务端只返回一个304,并不返回资源内容,客户端将会使用之前的缓存文件。而etags就是判断该文件是否被修改的记号,与服务器端的资源一一关联,所以etags对于CGI类型的页面缓存尤其有用。
下图是优化前的首页:(注意,此时没有压缩首页图片,即使使用了缓存,仍需要5s左右的时间)
化前的某页面
需要注意的是,使用etags会增加服务器端的负载,在实际应用中需要自行平衡。
二、Cookie优化
1.减小Cookie体积
HTTP coockie可以用于权限验证和个性化身份等多种用途。coockie内的有关信息是通过HTTP文件头来在web服务器和浏览器之间进行交流的。因此保持coockie尽可能的小以减少用户的响应时间十分重要。
使cookie体积尽量小;
在合适的子域名上设置bookie,以免影响其他子域名下的响应;
设置合理的过期时间,去掉不必要的cookie。
下面对比一下各个网站的cookie:
图中可以看出,6K的cookie显然是不必要的。
2.对于页面内容使用无coockie域名
当浏览器在请求中同时请求一张静态的图片和发送coockie时,服务器对于这些coockie不会做任何地使用。因此它们只是因为某些负面因素而创建的网络传输。所以你应该确定对于静态内容的请求是无coockie的请求。创建一个子域名并用他来存放所有静态内容。
例如,域名是
3.切分组件到多个域
主要的目的是提高页面组件并行下载能力,但注意,也不要同时使用过多的域名,否则就会出现第一条DNS lookup过多的问题,一般情况下两个域名就可以了。
4.杜绝 http 404 错误
对页面链接的充分测试加上对 Web 服务器 error 日志的不断跟踪可以有效减少 404 错误,并提升用户体验。
后记:
这次总结给我带来的启发并不在于提升系统性能性能本身,提升性能只是一个很表面上的东西,网上的方法有很多,测试的方法也有很多,照着都做一遍,性能确实会有所提升,但是这种知其然而不知其所以然的性能提升是没有意义的,这便是本文的目的所在。