在数据库中高效地克隆相当大的子树的方法是什么?

3

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

这是一个示例结构:

Example hierarchical structure

树中的每个对象都由数据库表行表示。此外,对于每个对象,还有几个关联的“附属对象”。例如,一个测试用例对象还有

  • 1..n个权限
  • 1..n个属性
  • 1..n个附件
  • ...

这些“附属对象”存储在单独的数据库表中。

复制树

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

此操作将所有子对象和所有“附属对象”复制到新位置。

从数据库的角度来看,这可能是数百甚至数千个SELECTINSERT语句,具体取决于要复制的子树的大小。

从用户的角度来看,会显示进度对话框以保持UI响应。此外,大多数用户抱怨执行“...简单的复制和粘贴...”操作需要太长时间。

优化性能

因此,我的目标是加速事情。

当前算法大致如下:

  1. 从数据库中读取一个对象。
  2. 将此对象存储为新条目到数据库中。
  3. 对于对象的所有“附属对象”执行相同的操作。
  4. 递归地对对象的所有子对象执行相同的操作。

可以想象,对于大量对象,这很快会累积到大量的数据库操作。

由于我迄今为止没有任何关于如何优化(批处理操作?但是如何以及针对哪个对象?),因此我的问题如下。

我的问题

您能否给出有关如何克隆大量按层次关系相关的对象的任何提示/模式/最佳实践,如上所述?

(理想情况下,在不依赖于特定数据库的情况下,尽管大多数情况下后端是Microsoft SQL Server)

1个回答

1

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

首先确保你在数据库上执行所有克隆操作,并避免这些往返操作。通过将当前的C#算法重写为SQL,使用递归存储过程应该可以实现你想要的功能。你应该能够看到显著的性能提升。

比我聪明的人可能会说可以使用单个CTE查询来完成,但this post似乎表明这是不可能的。当然,我无法想象如何在保留新ID之间的关系的情况下完成此操作。


你的假设是正确的,你的建议听起来真的很棒!我会好好思考一下如何实现它。非常感谢! - Uwe Keim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接