在SQL Server中没有合并时Upsert 5000+行的最有效/最佳做法是什么?

jus*_*key 5 sql sql-server merge sql-server-2005 upsert

我有一个Web应用程序,每秒接收大约50次点击,每次点击我在中央SQL Server数据库中大约10个记录.大约每3秒钟我就会为一个入站连接发送5000多行.

目前我有一个存储过程,它将XML作为参数.我从我的XML中执行INSERT到我的主表,其中行字段不匹配,然后用我的XML中的值更新整个表.

无论如何操作并不慢,但我真的想知道最好的方法.我在SQL Server 2005上运行,所以我没有MERGE操作.

gbn*_*gbn 6

我会先进行UPDATE,否则你将更新刚刚插入的行

SELECT .. INTO #temp FROM (shredXML)

BEGIN TRAN

UPDATE ... FROM WHERE (matches using #temp)

INSERT ... SELECT ... FROM #temp WHERE NOT EXISTS

COMMIT
Run Code Online (Sandbox Code Playgroud)

我还考虑将XML更改为临时表并使用SQLBulkCopy.我们发现这比通常解析XML超过几百行更有效.如果你不能改变这个,那么你首先将XML分解为临时表吗?

  • @richbayliss:有许多并发的5k行插入(对于许多客户端),然后每个小帮助.您需要提高整体吞吐量并减少XML碎化开销(如果在客户端中更改为XML,则会产生双重开销).与许多并发的5k插入相比,50亿行不是问题 (2认同)