【问题标题】:Performant way to clone rather large subtree in database?在数据库中克隆相当大的子树的高效方法?
【发布时间】:2011-11-03 14:29:48
【问题描述】:

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

这是一个示例结构:

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

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

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

复制树

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

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

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

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

优化性能

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

目前的算法是这样的:

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

正如您所想象的,对于大量对象,这很快就会总结为大量的数据库操作。

由于到目前为止我对如何优化(批量操作?但是如何以及针对哪个对象?)一无所知,所以我的问题如下。

我的问题

您能给我任何提示/模式/最佳实践,说明如何克隆如上所述的大量分层相关对象吗?

(最好采用与数据库无关的方式,尽管在大多数情况下后端是 Microsoft SQL Server)

【问题讨论】:

    标签: c# .net database clone


    【解决方案1】:

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

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

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

    【讨论】:

    • 您的假设是正确的,您的建议听起来非常棒!我会为此睡一晚,然后考虑如何实施。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多