我有一张表可容纳1-2米的数据行。
我有大量用户会一次批量发送100个数据。
为了简单起见,我们可以说表格看起来像是
ID, col1, col2... , val, UpdateTime
数据格式为
col1, col2, ..., val, RetrievedTime
col1, col2, ....
组合在一起构成了一个唯一约束,val
是我感兴趣的值。RetrievedTime
是检索日期的时间。
如果不存在,我需要将其插入表中,如果val
UpdateTime
和RetrieveTime > 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
两者似乎都在我的本地环境中运行得非常快,但是当服务器处于负载状态时,我会遇到很多超时。所以我想知道哪种方法对高度并发环境有更好的性能?为什么?