我想问一些小问题。如何加快下一个存储过程的性能。首先,需要说下一个表中有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
答案 0 :(得分:3)
一些想法:
为什么不
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;你最终会进行全表扫描。
三个选项:
(RowID)
单独(RowID, CheckDateID)
- 是的,在这种情况下,订单确实很重要!(RowID)
这三个选项旨在加快您RowID
声明中UPDATE
的范围查询速度。
不过要预先警告 - 调整数据库结构以加快这一个查询速度可能会对系统的其余部分和其他查询产生副作用,并且您可能会减慢这些问题。单独调查一个查询/存储过程总是一个非常危险的操作 - 你可能会破坏系统其他部分的大量破坏。