我需要帮助来加快执行存储过程的执行时间

时间:2009-12-26 11:28:28

标签: sql-server

我想问一些小问题。如何加快下一个存储过程的性能。首先,需要说下一个表中有30 000 000行:

CREATE TABLE tblT
  ( 
   [RowID] [int] IDENTITY(1, 1)
                 NOT NULL
  ,[CheckDateID] int NOT NULL
  ,[SSN] varchar(10)
  ,[CheckDate] datetime
  ,[val] money
    CONSTRAINT [PK_tblT]
    PRIMARY KEY CLUSTERED ( [CheckDateID] ASC, [RowID] ASC )
  )

我们在这里,这是一个SP,我需要一些合理的建议,我将如何能够修改这个proc.Critical这里是一个proc的执行时间......

DECLARE @RowMin [int]
 ,@RowMax [int]
 ,@Portion [int]
 ,@CurMin [int]
 ,@CurMax [int]
 ,@strMessage varchar(100)


SET @RowMin = ( SELECT min (RowID) FROM tblT )
SET @RowMax = ( SELECT max (RowID) FROM tblT )
SET @Portion = 350000
SET @CurMin = @RowMin
SET @CurMax = @CurMin + @Portion

WHILE @CurMax <> @CurMin
BEGIN

    Update A
    set val = val*8,3, --???
    from tblT  A 
    where A.RowID Between  @CurMin and @CurMax

    SET @CurMin = @CurMax
    SET @CurMax = case WHEN ( @CurMax + @Portion ) < @RowMax
                    THEN @CurMax + @Portion
                    ELSE @RowMax
                  END

END

2 个答案:

答案 0 :(得分:3)

一些想法:

  • RowID上有索引吗?
  • 为什么不

    SELECT @ RowMin = min(RowID),@ RowMax = max(RowId)FROM tbLT

而不是两个单独的查询

  • 为什么不简单

    更新tbLT SET val = val * 8.3在@CurMin和@CurMax之间的行ID =

  • 最大的问题是,为什么要整理更新声明?它 在我看来,你正在努力做到

更新tbLT SET val = val * 8.3

为了争用原因,您是否需要将更新语句分解为更小的部分?什么是此数据库上的恢复模型,您可能会从SQL记录此更新操作中获得性能损失......

答案 1 :(得分:1)

除了Sparky所说的 - 为什么你选择把PK放在(CheckDateId,RowID)上?有什么特别的原因吗?

通过这样做,您基本上使这个索引无法用于查询(例如您的UPDATE语句),其仅引用RowID - &gt;你最终会进行全表扫描。

三个选项:

  1. 将PK放在(RowID)单独
  2. 将您的PK更改为(RowID, CheckDateID) - 是的,在这种情况下,订单确实很重要!
  3. 仅在(RowID)
  4. 上添加新的非聚集索引

    这三个选项旨在加快您RowID声明中UPDATE的范围查询速度。

    不过要预先警告 - 调整数据库结构以加快这一个查询速度可能会对系统的其余部分和其他查询产生副作用,并且您可能会减慢这些问题。单独调查一个查询/存储过程总是一个非常危险的操作 - 你可能会破坏系统其他部分的大量破坏。