多个单插入和更新与批量合并

时间:2018-04-03 15:31:05

标签: sql sql-server

我有一张表可容纳1-2米的数据行。

我有大量用户会一次批量发送100个数据。

为了简单起见,我们可以说表格看起来像是

ID, col1, col2... , val, UpdateTime

数据格式为

col1, col2, ..., val, RetrievedTime

col1, col2, ....组合在一起构成了一个唯一约束,val是我感兴趣的值。RetrievedTime是检索日期的时间。

如果不存在,我需要将其插入表中,如果val

,则需要更新UpdateTimeRetrieveTime > UpdateTime

目前我将所有100行插入临时表并执行不存在的插入+更新存在以将数据推送(合并)到实际表

我想知道单独进行100次插入+更新调用是否更好

100插入临时表,然后一个插入不存在+更新存在

INSERT INTO #TempTable Values(...)
INSERT INTO #TempTable Values(...)
INSERT INTO #TempTable Values(...)
INSERT INTO #TempTable Values(...)
... 100 rows

INSERT INTO ActualTable SELECT ... FROM #TempTable WHERE NOT EXISTS(...)
UPDATE ActualTable SET val = ... INNER JOIN #TempTable T ON ... WHERE T.col1 = ActualTable.col1

VS

启用IGNORE_DUP_KEY(唯一键复制将抛出异常。相反,它将跳过并继续)

INSERT INTO ActualTable VALUES (...)
INSERT INTO ActualTable VALUES (...)
INSERT INTO ActualTable VALUES (...)
INSERT INTO ActualTable VALUES (...)
... 100 inserts

UPDATE ActualTable SET val = ..., UpdateTime=RetrieveTime WHERE col1=.. AND col2=.. AND RetrieveTime > UpdateTime
UPDATE ActualTable SET val = ..., UpdateTime=RetrieveTime WHERE col1=.. AND col2=.. AND RetrieveTime > UpdateTime
UPDATE ActualTable SET val = ..., UpdateTime=RetrieveTime WHERE col1=.. AND col2=.. AND RetrieveTime > UpdateTime
UPDATE ActualTable SET val = ..., UpdateTime=RetrieveTime WHERE col1=.. AND col2=.. AND RetrieveTime > UpdateTime
... 100 updates

两者似乎都在我的本地环境中运行得非常快,但是当服务器处于负载状态时,我会遇到很多超时。所以我想知道哪种方法对高度并发环境有更好的性能?为什么?

0 个答案:

没有答案