C# 如何在数据库中克隆相当大的子树?

C# 如何在数据库中克隆相当大的子树?,c#,.net,database,clone,C#,.net,Database,Clone,目前,我正在尝试对Windows Forms.NET 2.0应用程序中的代码进行性能优化,该应用程序对分层数据库对象执行复制操作 以下是一个示例结构: 树中的每个对象都由数据库表行表示。此外,对于每个对象,还存在多个关联的边对象。例如,测试用例对象也具有 1..n权限 1..n属性 1..n附件 ... 这些边对象存储在单独的数据库表中 复制树木 应用程序的用户可以选择树元素,右键单击并选择“复制”,然后将其粘贴到树中的另一个位置 此操作将所有子对象和所有边对象复制到新位置 从数据库的角度来看,

目前,我正在尝试对Windows Forms.NET 2.0应用程序中的代码进行性能优化,该应用程序对分层数据库对象执行复制操作

以下是一个示例结构:

树中的每个对象都由数据库表行表示。此外,对于每个对象,还存在多个关联的边对象。例如,测试用例对象也具有

1..n权限 1..n属性 1..n附件 ... 这些边对象存储在单独的数据库表中

复制树木

应用程序的用户可以选择树元素,右键单击并选择“复制”,然后将其粘贴到树中的另一个位置

此操作将所有子对象和所有边对象复制到新位置

从数据库的角度来看,这可能是数百甚至数千条SELECT和INSERT语句,这取决于要复制的子树的大小

从用户的角度来看,将显示一个进度对话框,以保持UI的响应性。除此之外,大多数用户抱怨做一个简单的复制和粘贴要花很长时间。。。手术

优化性能

所以我的目标是加快速度

当前的算法是这样的:

从数据库中读取对象。 将此对象作为新条目存储到数据库中。 对对象的所有侧面对象执行相同的操作。 递归地对对象的所有子对象执行相同的操作。 可以想象,对于大量的对象,这很快就归结为大量的数据库操作

因为到目前为止我还不知道如何优化批处理操作?但是,我的问题是,如何以及针对哪个对象

我的问题

关于如何如上所述克隆大量层次结构相关对象,您能给我一些提示/模式/最佳实践吗


理想情况下,以一种与数据库无关的方式,尽管后端在大多数情况下是Microsoft SQL Server

我假设您在.NET应用程序中进行所有克隆,这会导致大量到数据库服务器的往返

首先,确保在数据库上进行所有克隆,并避免这些往返。应该可以准确地执行您正在执行的操作,但使用递归存储过程,只需在SQL中重写当前的C算法即可。您应该会看到性能的大幅提升


比我聪明的人可能会说,这可以用一个CTE查询来完成,但似乎暗示这是不可能的。当然,我看不出你会如何做到这一点并保持新ID之间的关系

你的假设是正确的,你的建议听起来真的很棒!我会为此睡上一晚,然后考虑如何实施。谢谢!