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

时间:2011-08-25 11:18:20

标签: c# .net database clone

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

以下是一个示例结构:

Example hierarchical structure

树中的每个对象都由数据库表行表示。另外,对于每个对象,还存在若干关联的“侧面对象”。例如。 测试用例对象也有

  • 1..n权限
  • 1..n attributes
  • 1..n附件
  • ...

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

复制树

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

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

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

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

优化效果

所以我的目标是加快速度。

目前的算法是这样的:

  1. 从DB中读取对象。
  2. 将此对象存储为DB的新条目。
  3. 为对象的所有“侧面对象”执行相同的操作。
  4. 递归地对对象的所有子对象执行相同操作。
  5. 可以想象,对于大量对象,这很快就会导致大量的数据库操作。

    由于到目前为止我还没有关于如何优化(批处理操作?但是如何以及针对哪个对象?)的线索,我的问题如下:

    我的问题

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

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

1 个答案:

答案 0 :(得分:1)

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

首先确保您在数据库上进行所有克隆并避免这些往返。应该可以完成你正在做的事情,但是使用递归存储过程,只需在SQL中重写当前的C#算法。你应该看到一个巨大的性能提升。

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