2

我在 C# 中创建了一个函数,它允许我将记录及其相关子项复制到同一数据库中的新记录和新相关子项中。(这适用于允许将以前的作品用作新作品的模板的应用程序。)

无论如何,它工作得很好......这是它如何完成副本的描述:

它使用每条记录的当前主键填充基于内存的两列查找表。接下来,当它单独创建每个新副本记录时,它使用新记录的身份 PK [从 SCOPE_IDENTITY() 检索] 更新查找表。现在,当它复制任何相关的孩子时,它可以查找新的父 PK 以在新记录上设置 FK。

在测试中,只需一分钟就可以在 SQL Server 2005 Express Edition 的本地实例上复制关系结构。不幸的是,事实证明它的生产速度非常慢!我的用户正在通过 LAN 与我们的 SQL Server 处理每条父记录的 60,000 多条记录!虽然我的复制功能仍然有效,但这些记录中的每一个都代表一个单独的 SQL UPDATE 命令,它以大约 17% 的 CPU 从其正常的 2% 空闲加载 SQL Server。我刚刚完成了 50,000 条记录副本的测试,花了将近 20 分钟!

有没有办法在 SQL 查询或存储过程中复制此功能,以使 SQL 服务器完成所有复制工作,而不是从每个客户端通过 LAN 爆破它?

(我们运行的是 Microsoft SQL Server 2005 标准版。)

谢谢!

-德里克

4

2 回答 2

1

是的,如果是 SQL 2005,您可能会使用 CLR 存储过程将您的 C# 代码安装到 Db 中。要做纯 TSQL,只是它很乏味并且需要为新键使用变量。这只是一个父记录的情况,然后是许多仅在一个子表中的子记录吗?在这种情况下,您可以通过利用可以将 select 语句嵌入到插入中这一事实来潜在地避免为每个子行发出单独的插入命令,尤其是当您为 PK 使用标识列时。如果你能做到,那通常会快得多。像这样的东西(语法可能有点不对,但无论如何你都需要适应你的真实表格):

insert into tblchild select @newparentId, col1,col2 from tblChild where parentid=@oldparentid

这是 SQL Server 中 CLR 的起点...

http://msdn.microsoft.com/en-us/library/ms131045.aspx(这篇文章是 SQL 2008,但其中大部分可能适用)。

http://www.sqlteam.com/article/writing-clr-stored-procedures-in-charp-introduction-to-charp-part-1

于 2010-04-29T23:04:11.450 回答
0

将使用(伪代码)

INSERT INTO (PkField, FkField, OtherFields) SELECT NewPkValue, NewFkValue, OtherFields FROM TableName WHERE FkField = OldFkValue

对相关子表的帮助,因为它们将被批处理而不是每条记录的单个更新?

于 2010-04-29T23:26:00.963 回答