寻求性能高手
- SQL code
ALTER PROCEDURE [dbo].[up_PP_AddCuringInfo]@TyreNO CHAR(10),--胎号@GreenTyreNo CHAR(10),--成型工号@MaterialID CHAR(9),--物料编号@LeftOrRight CHAR(1),--左右模标志@BeginTime VARCHAR(20),--硫化开始时间@MachineID VARCHAR(7),--机台编号@IDinFac varchar(20),--机台名称@DayShiftName VARCHAR(4),--班次@MouldID VARCHAR(10),--模具编号@WorkerID VARCHAR(20),--操作工人名@ShiftNo VARCHAR(16),--接班编号@GroupName VARCHAR(10)--班组ASSET NOCOUNT ONDECLARE @GroupID VARCHAR(2)--班组编号DECLARE @TempTyreNO varchar(10)--胎号临时变量DECLARE @TempGreenTyreNo varchar(15)--成型工号临时变量DECLARE @SizeID varchar(10)--规格DECLARE @PlyRatingID varchar(10)--层级DECLARE @PatternID varchar(10)--花纹DECLARE @BrandID varchar(10)--品牌DECLARE @StandardID varchar(10)--标准DECLARE @AttributeID varchar(10)--属性DECLARE @SizeName varchar(30)--规格DECLARE @PlyRatingName varchar(30)--层级DECLARE @PatternName varchar(30)--花纹DECLARE @BrandName varchar(30)--品牌DECLARE @StandardName varchar(30)--标准DECLARE @AttributeName varchar(30)--属性DECLARE @MATERIALCODE varchar(30)--物料编码DECLARE @PLANID VARCHAR(16)--计划编号DECLARE @PLANDETAILID VARCHAR(2)--计划明细编号DECLARE @DayShiftID VARCHAR(2)DECLARE @GreenTyreMaterialID VARCHAR(20)--胎胚物料编号DECLARE @GreenTyreMaterialCode VARCHAR(80)--胎胚物料名称SET @DayShiftID=CASE @DayShiftName WHEN '早' THEN '01' WHEN '中' THEN '02' WHEN '夜' THEN '03' END--得到班组编号SELECT @GroupID=GroupIDFROM TB_HR_GroupWHERE GroupName=@GroupName--得到品牌、规格、层级、花纹、标准、属性SELECT @SizeID=T1.SizeID, @SizeName=T1.SizeName, @PlyRatingID=T1.PlyRatingID, @PlyRatingName=T1.PlyRatingName, @PatternID=T1.PatternID, @PatternName=T1.PatternName, @BrandID=T1.BrandID, @BrandName=T1.BrandName, @StandardID=T1.StandardID, @StandardName=T1.StandardName, @AttributeID=T1.AttributeID, @AttributeName=T1.AttributeName, @MATERIALCODE=T1.MATERIALCODEFROM V_MaterialCode T1WHERE MaterialID=@MaterialID--获得计划编号SELECT @PLANID=SUBSTRING(@ShiftNo,8,6)+SUBSTRING(@ShiftNo,1,7)+SUBSTRING(@ShiftNo,14,2)+'0'DECLARE @planCount intSELECT @planCount=COUNT(1) FROM TB_PP_PLAN WHERE PlanID=@PLANIDIF(@planCount<=0)--如果计划表里没有该计划,则创建BEGIN INSERT tb_PP_Plan(PlanID,PlanDate,PlanShift,MachineID,PlanState,RecorderID,RecordTime) VALUES(@PLANID,GETDATE(),@DayShiftID,@MachineID,'2',@WorkerID,GETDATE())ENDSELECT TOP 1 @PLANDETAILID=ISNULL(PLANDETAILID,'') FROM TB_PP_PLANDETAIL WHERE PLANID=@PLANID AND MATERIALID=@MaterialID AND PLANSTATE='2'IF(@PLANDETAILID='')BEGIN SELECT @PLANDETAILID='0'+ISNULL(CAST(CAST(MAX(PlanDetailID) AS INT)+1 AS VARCHAR),'1') FROM tb_PP_PlanDetail WHERE planid=@PLANID INSERT TB_PP_PLANDETAIL(PlanID,PlanDetailID,MaterialID,PlanAmount,PlanState,PlanFlag,Remark,RecorderID,RecordTime,GroupID,RealAmount) VALUES(@PLANID,@PLANDETAILID,@MaterialID,200,'2','2','系统自动添加',@WorkerID,GETDATE(),@GroupID,0)END--获得胎胚物料SELECT @GreenTyreMaterialID=T1.MaterialID,@GreenTyreMaterialCode=T2.MaterialCode FROM tb_PP_MouldingOutput T1 LEFT JOIN tb_TE_Material T2 ON T1.MaterialID=T2.MaterialIDWHERE GreenTyreNo = @TyreNoSET XACT_ABORT ONBEGIN TRAN T1 --添加胎胚出库信息 UPDATE tb_PP_MouldingOutput SET OutFlag='1' WHERE GreenTyreNo=@TyreNo --更新胎胚库存表 UPDATE tb_PP_MouldReMainInfo SET Amount=Amount-1 WHERE MaterialID=@GreenTyreMaterialID UPDATE tb_SY_tyrestate SET spec=@SizeID, SpecName=@SizeName, layer=@PlyRatingID, layerName=@PlyRatingName, texture=@PatternID, textureName=@PatternName, Brand=@BrandID, brandName=@BrandName, [standard]=@StandardID, standardname=@StandardName, attribute=@AttributeID, attributename=@AttributeName, MaterialID=@MaterialID, MaterialName=@MATERIALCODE, SulfBeginTime=@BeginTime, SulfEndTime=@BeginTime, SulfEquipCode=@IDinFac, SulfShift=@DayShiftName, SulfTeam=@GroupName, sulfcarrayshift=@shiftno, SulfOper=@WorkerID, sulfpattern=@MouldID, TyreState='05'--硫化未质检 WHERE TyreId=@TyreNO--存在则更新 IF @@rowcount=0 BEGIN INSERT INTO tb_SY_tyrestate(spec, layer, Brand, texture, [standard], attribute, SpecName, layerName, textureName, brandName, standardname, attributename, TyreID, GreenTyreId, MaterialID, MaterialName, SulfBeginTime, SulfEndTime, SulfEquipCode, SulfShift,SulfTeam,sulfcarrayshift, SulfOper, sulfpattern, TyreState) VALUES(@SizeID, @PlyRatingID, @BrandID, @PatternID, @StandardID, @AttributeID, @SizeName, @PlyRatingName, @PatternName, @BrandName, @StandardName, @AttributeName, @TyreNO, @GreenTyreNO, @MaterialID, @MATERIALCODE, @BeginTime, @BeginTime, @IDinFac, @DayShiftName,@GroupName,@shiftno, @WorkerID, @MouldID, '05') END INSERT INTO tb_PP_CuringOutput(TyreNo, ShiftNo, GreenTyreNO, MaterialID, PlanNO, PlanDetailNo, BeginTime, EndTime, MouldID, LeftOrRight,SulfEquipCode, SulfOper,SulfShift,SulfTeam) VALUES(@TyreNO, @ShiftNo, @GreenTyreNo, @MaterialID, @PLANID, @PLANDETAILID, @BeginTime,@BeginTime, @MouldID, @LeftOrRight, @IDinFac, @WorkerID,@DayShiftName,@GroupName) --更新生产计划表,实际完成数 IF(@PLANDETAILID<>'') BEGIN UPDATE TB_PP_PLANDETAIL SET REALAMOUNT = ISNULL(REALAMOUNT+1,1), GROUPID=(CASE ISNULL(REALAMOUNT+1,1) WHEN 1 THEN @GroupID ELSE GROUPID END) WHERE PLANID=@PLANID AND PLANDETAILID=@PLANDETAILID END --更新机台状态表 UPDATE tb_PP_MachineCurrentInfo SET TyreNo=@TyreNo ,CapsuleCount=CapsuleCount+1 WHERE MachineID=@MachineID AND LeftOrRight=@LeftOrRightIF @@ERROR<>0BEGIN ROLLBACK TRAN T1ENDELSEBEGIN COMMIT TRAN T1END
以上存储过程,一天大约执行1万次。
问题:大多数时候执行效率较低,8s到30s才能执行完成,但是有时候执行几乎不花费时间。
有时候重启服务就能保证效率,但是有时候还是不行。
[解决办法]
帮顶!
[解决办法]
好长,帮顶先
[解决办法]
语句里似乎没什么可优化的,毕竟不熟悉你们的业务。可以试着在查询里加上NOLOCK提示,因为每天1W次并发性可能会比较高,再就是检查语句是否都能充分使用索引。
[解决办法]
[解决办法]
帮顶!
[解决办法]
学习SSSSSS
[解决办法]
若是有偿优化。。偶乐意接手。。四分苦力+三分智力+三分经验
[解决办法]
好多的更新语句
[解决办法]
先看看有无设计问题
比如
--得到班组编号
SELECT @GroupID=GroupID
FROM TB_HR_Group
WHERE GroupName=@GroupName
这是没必要的,应该直接传参数GroupID,而不是每天10000次的查询,虽然可能有索引每次很快,但是如果一次读入TB_HR_Group的相关两字段到内存,在内存查好GroupID,就不必每天查10000次。
[解决办法]
看过,帮顶...
[解决办法]
[解决办法]
其他的需要知道数据量,那个表大都不知道怎么知道问题关键
[解决办法]
语句里涉及到了查找、插入和更新,如果可能的话可不可以把这三块分开设计成三部分存储过程,这样一方面是方便调试,另一方面保存的执行计划也更简洁
[解决办法]
石头哥在忙,KG和大叔这几天没上CSDN,我帮你问问
[解决办法]
看了半天,除了select就是insert 和update,似乎也没有大数据量的操作。
把涉及到的表,都单独测试select insert update 。看看速度是否慢在某个表的操作
[解决办法]
[解决办法]
更新/插入感觉大部分是单条数据操作,索引也建好了,所以语句本身应该不会有问题。
是否有其他的业务逻辑也会涉及到这几个表呢?操作时受其他事务锁的影响?
可以把每步执行的时间记录日志,查看当效率低下的时候,延迟是否集中在某个步骤
另外
- SQL code
SELECT TOP 1 @PLANDETAILID=ISNULL(PLANDETAILID,'') FROM TB_PP_PLANDETAIL WHERE PLANID=@PLANID AND MATERIALID=@MaterialID AND PLANSTATE='2'[color=#FF0000]IF(@PLANDETAILID='')[/color]BEGIN 。。。。END
[解决办法]
楼主最近可好!
[解决办法]
1.看下IO情况,如果有较大的逻辑读,看是否有适合的索引.
SET STATISTICS IO ON
EXEC up_PP_AddCuringInfo
2.慢,也有可能是资源等待,比如更新或查询有,有其它事务在更新。
3.SET XACT_ABORT ON时,印象中捕捉不到@@error,那么下面的是否有用?
IF @@ERROR<>0
BEGIN
ROLLBACK TRAN T1
END
[解决办法]
- SQL code
UPDATE tb_SY_tyrestate SET spec=@SizeID, SpecName=@SizeName, layer=@PlyRatingID, layerName=@PlyRatingName, texture=@PatternID, textureName=@PatternName, Brand=@BrandID, brandName=@BrandName, [standard]=@StandardID, standardname=@StandardName, attribute=@AttributeID, attributename=@AttributeName, MaterialID=@MaterialID, MaterialName=@MATERIALCODE, SulfBeginTime=@BeginTime, SulfEndTime=@BeginTime, SulfEquipCode=@IDinFac, SulfShift=@DayShiftName, SulfTeam=@GroupName, sulfcarrayshift=@shiftno, SulfOper=@WorkerID, sulfpattern=@MouldID, TyreState='05'--硫化未质检 WHERE TyreId=@TyreNO--存在则更新 IF @@rowcount=0 BEGIN INSERT INTO tb_SY_tyrestate(spec, layer, Brand, texture, [standard], attribute, SpecName, layerName, textureName, brandName, standardname, attributename, TyreID, GreenTyreId, MaterialID, MaterialName, SulfBeginTime, SulfEndTime, SulfEquipCode, SulfShift,SulfTeam,sulfcarrayshift, SulfOper, sulfpattern, TyreState) VALUES(@SizeID, @PlyRatingID, @BrandID, @PatternID, @StandardID, @AttributeID, @SizeName, @PlyRatingName, @PatternName, @BrandName, @StandardName, @AttributeName, @TyreNO, @GreenTyreNO, @MaterialID, @MATERIALCODE, @BeginTime, @BeginTime, @IDinFac, @DayShiftName,@GroupName,@shiftno, @WorkerID, @MouldID, '05') END
[解决办法]
[解决办法]
[解决办法]
[解决办法]
[解决办法]
下班前顶
[解决办法]
客户端并发高的时候,会导致每条执行效率底。。建议设置一下数据库的并发数,和对数据库分配的内存再加大一些试试。。。因为你说有的时候执行快有的时候执行慢,我想跟过程本身关系部大,还是数据库服务器设置的问题。先把并发数设置下试试。
如果想优化过程建议每个操作步骤中间打印出时间来看哪段效率低,如果是查询部分效率低可以适当创建索引,但可能会降低导致插入数据的效率。
[解决办法]
[解决办法]
[解决办法]
标题我看成“寻求性能力高手。。。。”
[解决办法]
很抱歉,我想歪了,我以为是找我这种X功能高手
[解决办法]
我估是tran有及放源
[解决办法]
[解决办法]
在存储过程之外找过问题吗?
比如事务里相关表的耗时检索、统计之类的。我觉得这个可能性居大。
如果找不到,那想办法控制存储过程的同时执行数。
[解决办法]
[解决办法]
给的信息太少了.
1) 贴出22#说的这只SP的I/O情况
2) 贴出DBCC MEMORYSTATUS的结果
3) 贴出服务器的配置、DB大小、连接数等.
[解决办法]
学习一下
[解决办法]
[解决办法]
顶一下下下
[解决办法]
帮顶。。。
[解决办法]
“以上存储过程,一天大约执行1万次。”
一个PROC,执行一万次,一口气执行,如果每个PROC,都要分别做查,改的操作,本来就不可能快的
“大多数时候执行效率较低,8s到30s才能执行完成,但是有时候执行几乎不花费时间”
因为你的过程中,有查,有改
如果每个都要改,时间当然就长了
而有的,只查不改,时间就短了
“有时候重启服务就能保证效率,”
重启,是因为临时表空间被清空了,可以重新使用了
“但是有时候还是不行”
其实,你要看具体数据,这个不行,是不行到什么程度?
[解决办法]
不能看语句慢就认为是SQL的问题。。。
也可能是外部争用。。。或者是配置存在瓶颈。
建议SYSTEM MONITOR和profile结合跟踪一下。
------解决方案--------------------
建议使用RAMDISK来存放TEMPDB,然后在TEMPDB里面运算,最终结果写回自己的数据库,以提高速度。
[解决办法]
[解决办法]
你那也太长了吧!帮你顶吧!
[解决办法]
1 语句中尽量不要用not
<>分开写比较好
2 尽量不要连接列
[解决办法]
看成了寻找 性能力 高手
[解决办法]
你最好把数据库文件也放出来。
执行时间慢,可能跟硬件有关系与cpu内存磁盘的负载;也有可能是阻塞的原因。
[解决办法]
基本上涉及索引和并发锁定
没有实际环境,不好说
着手点:
把存储过程的基本sql拆分开来逐条检查,观察查询计划。
[解决办法]
绑定,在学习。。。
[解决办法]
好长的存储过程
不知道增强一下机器的配置 性能是否会有提升