繁体   English   中英

SQL Server插入与删除和提交事务

[英]SQL Server Insert vs Delete and Commit Transaction

我有一个使用HTML5画布的HTML5前端。 画布显示一组图像,用户可以操作(移动它们),然后单击“保存”。 然后“保存”将图像数据列表(例如x,y坐标)发送到asmx网络服务。

目前:我正在删除会话的所有记录并重新插入新记录,但是如果会话从未保存过,那么我正在插入。

我的第一个问题是建议删除并插入或仅运行更新。 哪一个计算强度较低?

其次,我要确保所有会话数据都已提交,即,如果我发送46行数据,则要确保将其写入。 在删除/插入场景中,删除可能会继续,而插入可能会失败。

如何使用交易完成此任务。

目前,我只是使用一个实体框架,选择会话数据,将其删除,然后再次重新插入数据。

任何指针将不胜感激。

我的第一个问题是建议删除并插入或仅运行更新。 哪一个计算强度较低?

更新比删除并插入便宜。 原因是瓶颈在于磁盘(而非计算)。 插入和删除操作会在磁盘页面上分配和释放字节,并且可能需要更新一个或两个索引。 更新将使它们保留在原位,仅更改几个字节,从而减少了IO。 最重要的是,插入和删除是两项操作(+这会影响任何索引),而更新项只有一项。 (btw记录日志还有更多开销)

如果您使用的是sql2008或更高版本,则可以使用表值参数 ,因为您可以将整个更新集一次性发送到sql,所以这些参数对您所描述的效果应该很好。 如果使用常规更新语句,则需要运行46条语句。

如果您真的想进行调整,则可能还需要考虑将TVP与merge语句结合使用,以在单个操作中处理更新和插入的混合。

话虽如此,您可能只想使用代码中最简单的方法。 如果您没有性能问题,则无需修复。

其次,我要确保所有会话数据都已提交,即,如果我发送46行数据,则要确保将其写入。 在删除/插入场景中,删除可能会继续,而插入可能会失败。

实际上,您可以使用事务进行更新或删除/插入。

begin tran 

delete * from table where some condition

insert into table (value1, value 2) values (1, 2), (3, 4) .. 

commit tran

这将整体上成功或不更改数据库。 使用表值参数也是如此。

与TVP一起查看MERGE语句

我还创建了一个临时表,并使用了SqlBulkCopy类(当然,后面是MERGE)效果很好。 SqlBulkCopy通常用于更多行,但使用起来很简单(比TVP要多),因此在这些情况下使用它不会造成任何危害。

另一种选择是做一个临时表,并在表中插入许多插入文件,然后进行合并。 通过一次发送所有指令,您将获得良好的性能。 如果您想让我猜,也可以执行46个合并语句-您必须对值进行内联选择。

在所有情况下,尽管MERGE是原子的,但对于前两个交易并非绝对必要,但交易将是适当的。 如果您开始做更多的事情,仍然要养成良好的习惯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM