繁体   English   中英

程序高CPU使用率

[英]Procedure high CPU usage

我们有一个运行请求率很高的特定SP的应用程序。 在SQLServer Profiler中,我看到此SP占用了很高的CPU使用率,但是当我运行alter SP(更改不更改SP逻辑,只是更改为存在的SP!)时,CPU使用率下降了,一个小时后又上升了。 我真的很困惑为什么此操作会降低CPU使用率,以及如何解决呢?

SP的定义如下:

ALTER PROCEDURE [dbo].[MySP]
    @UId BigInt ,
    @Ml int, 
    @MXL int, 
    @R1 int, 
    @R2 int,
    @R3 int,
    @R4 int ,
    @debugmode bit
AS 
    If(@Ml < 1)
        Set @Ml = 1

    If (@MXL > 99 )
        Set @MXL = 99

    If (@Ml >= 42 OR @debugmode = 1)
    Begin
        with 
        tmp_one as
        (
            SELECT
                    R.Id as RID 
                    FROM    [U] as U
                                Inner Join
                            [R] as R
                                On  R.UId = U.Id

                    WHERE       ([R].[L] BETWEEN @Ml AND @MXL) 
                            AND (R.UId <> @UId) 
                            AND (0 =  [U].[Status])
                            AND (1 =  [U].[ActionStatus])
                            AND ((ABS((BINARY_CHECKSUM(NEWID(),R.Id)))% 10000)/100 ) BETWEEN @R1 AND (@R1 + 10)
        )
        Select  top 10 RID
            From    tmp_one
            Order By RID
    End

    Else 
    Begin
        with 
        tmp_one as
        (
            SELECT
                    R.Id as RID 
                    FROM    [User] as U
                                Inner Join
                            [Rooster] as R
                                On  R.UID = U.Id

                    WHERE       ([R].[L] BETWEEN @Ml AND @MXL)  
                            AND (0 =  [U].[Status])
                            AND (1 =  [U].[ActionStatus])
                            AND ((ABS((BINARY_CHECKSUM(R.Id,NEWID())))% 10000)/100 )  BETWEEN @R1 AND (@R1 + 10)
        ),
        tmp_two as
        (
            Select  tmp_one.RID as RID
                From    tmp_one
                Where   ((ABS((BINARY_CHECKSUM(RID,NEWID())))% 10000)/100 )  BETWEEN @R2 AND (@R2 + 10)
        ),
        tmp_three as
        (
            Select  RID as RID 
                From    tmp_two
                Where   ((ABS((BINARY_CHECKSUM(NEWID())))% 10000)/100 )  BETWEEN @R3 AND (@R3 + 10)
        ),
        tmp_four as
        (
            Select  TOP 100 RID as RID 
                From    tmp_three
                Where   ((ABS((BINARY_CHECKSUM(NEWID())))% 10000)/100 )  BETWEEN @R4 AND (@R4 + 10)
        )
        Select  TOP(10)
                RID
            From    tmp_four
            Order By RID
    End

我在参数嗅探中发现问题! 我通过声明局部变量并将参数放在这些变量上来修复它。

有关SQL Server参数嗅探的一些最佳文章: http : //blogs.msdn.com/b/turgays/archive/2013/09/10/parameter-sniffing-problem-and-workarounds.aspx

http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM