首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

寻求性能高手,该如何解决

2012-04-08 
寻求性能高手SQL codeALTER PROCEDURE [dbo].[up_PP_AddCuringInfo]@TyreNO CHAR(10),--胎号@GreenTyreNo

寻求性能高手

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次并发性可能会比较高,再就是检查语句是否都能充分使用索引。
[解决办法]
探讨
一天大约执行1万次

[解决办法]
帮顶!
[解决办法]
学习SSSSSS
[解决办法]
若是有偿优化。。偶乐意接手。。四分苦力+三分智力+三分经验
[解决办法]
好多的更新语句
[解决办法]
先看看有无设计问题
比如
--得到班组编号
SELECT @GroupID=GroupID
FROM TB_HR_Group
WHERE GroupName=@GroupName

这是没必要的,应该直接传参数GroupID,而不是每天10000次的查询,虽然可能有索引每次很快,但是如果一次读入TB_HR_Group的相关两字段到内存,在内存查好GroupID,就不必每天查10000次。

[解决办法]
看过,帮顶...

[解决办法]
探讨
引用:

语句里似乎没什么可优化的,毕竟不熟悉你们的业务。可以试着在查询里加上NOLOCK提示,因为每天1W次并发性可能会比较高,再就是检查语句是否都能充分使用索引。

相关的索引都建立好了。

[解决办法]
其他的需要知道数据量,那个表大都不知道怎么知道问题关键
[解决办法]
语句里涉及到了查找、插入和更新,如果可能的话可不可以把这三块分开设计成三部分存储过程,这样一方面是方便调试,另一方面保存的执行计划也更简洁
[解决办法]
石头哥在忙,KG和大叔这几天没上CSDN,我帮你问问
[解决办法]
看了半天,除了select就是insert 和update,似乎也没有大数据量的操作。

把涉及到的表,都单独测试select insert update 。看看速度是否慢在某个表的操作
[解决办法]
探讨

引用:
一天大约执行1万次

[解决办法]
更新/插入感觉大部分是单条数据操作,索引也建好了,所以语句本身应该不会有问题。

是否有其他的业务逻辑也会涉及到这几个表呢?操作时受其他事务锁的影响?

可以把每步执行的时间记录日志,查看当效率低下的时候,延迟是否集中在某个步骤

另外
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 


[解决办法]

探讨

楼主最近可好!

[解决办法]
探讨
引用:

楼主最近可好!


密码回来了?

[解决办法]

[解决办法]
探讨
引用:

楼主最近可好!

还可以。你怎么样。

[解决办法]
下班前顶
[解决办法]
客户端并发高的时候,会导致每条执行效率底。。建议设置一下数据库的并发数,和对数据库分配的内存再加大一些试试。。。因为你说有的时候执行快有的时候执行慢,我想跟过程本身关系部大,还是数据库服务器设置的问题。先把并发数设置下试试。

如果想优化过程建议每个操作步骤中间打印出时间来看哪段效率低,如果是查询部分效率低可以适当创建索引,但可能会降低导致插入数据的效率。
[解决办法]
探讨
楼主最近可好!

[解决办法]
探讨
引用:
楼主最近可好!


oh 我看到狼了。。。

[解决办法]
标题我看成“寻求性能力高手。。。。”
[解决办法]
很抱歉,我想歪了,我以为是找我这种X功能高手
[解决办法]
我估計是tran沒有及時釋放資源
[解决办法]
探讨

1.看下IO情况,如果有较大的逻辑读,看是否有适合的索引.
SET STATISTICS IO ON
EXEC up_PP_AddCuringInfo

2.慢,也有可能是资源等待,比如更新或查询有,有其它事务在更新。

3.SET XACT_ABORT ON时,印象中捕捉不到@@error,那么下面的是否有用?
IF @@ERROR<>0
BEGIN
RO……

[解决办法]

在存储过程之外找过问题吗?

比如事务里相关表的耗时检索、统计之类的。我觉得这个可能性居大。

如果找不到,那想办法控制存储过程的同时执行数。
[解决办法]
探讨
标题我看成“寻求性能力高手。。。。”

[解决办法]
给的信息太少了.

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拆分开来逐条检查,观察查询计划。


[解决办法]
绑定,在学习。。。
[解决办法]
好长的存储过程

不知道增强一下机器的配置 性能是否会有提升

热点排行