为了账号安全,请及时绑定邮箱和手机立即绑定

用scope_identity()用法执行嵌套批量插入的最快方法?

用scope_identity()用法执行嵌套批量插入的最快方法?

慕娘9325324 2019-10-22 21:18:01
在我们的一个(C#)应用程序中,我们正在插入/更新一个大图(100个插入和更新)。这被包装在事务中,因为如果发生错误,我需要整个回滚。我们正在使用Dapper执行SQL语句。不幸的是,整个操作目前需要2到8秒。这是数据库中核心表被锁定的2到8秒,这导致其他应用程序挂起或遭受锁定。我确定插入到包含超过1.2亿条记录的表中的一项操作大部分时间都在占用,但是我不确定如何优化此操作。大致而言,该表图的设置如下:table A (  id int primary_key,  name nvarchar)table B (    id int primary_key,    a_id int foreign_key, # has an index    name nvarchar)将数据插入时,A我还需要将相应的数据插入B。因此,我scope_identity()用来获取记录的ID,并在将记录插入时使用它B。伪明智地如下所示:# open transaction# perform other table inserts## this is one of the slowest operationsfor item in list_a    id_a = exec "insert into A (name) values (" + item.name + "); select scope_identity() as int"    for bar in item.list_b        exec "insert into B (id_a, name) values (" + id_a + ", " + bar.name + ")"## perform more operations# commit transaction谷歌搜索时,解决方案之一是将其包装在事务中。但是我不知道性能如何,因为它已经包装在父事务中。它能解决问题吗?通过使用插入记录来提供第二种解决方案union all select...,但是不知道我是否可以scope_identity()在该调用中使用。我该如何改善这种情况?为了加快操作速度或防止其他应用程序遭受这些锁定,我还能做些其他事情吗?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

我尚未完成实施,但是我从您的想法开始。基本上,我创建了登台表,在其中执行代码中的整个保存。这会将这些表锁定2至8秒钟,但这对我来说不是问题,因为它们在其他任何地方都没有使用。保存后,我调用一个存储过程,该过程将实际副本复制到主表中。那就是最快的。

查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 689 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信