0

我正在切换我的一些 Linq to Sql 代码以使用 SqlBulkCopy,问题是我需要将数千行的两次插入到两个表中。

该服务获取您的一批 10,000 个链接(从站点地图、反向链接构建器等导入),并将它们切分成每个提要 X 的 RSS 提要以进行聚合。问题是,我已经有一个3200 万行的表。如果我正在执行 linq to sql 插入,则加载 10,000 个链接需要 5 到 10 分钟之间的任何站点流量。

结构非常基础。

提要:Id bigint (PK)、Title varchar(1000)、Description varchar(1000)、Published datetime、Aggregated datetime null、ShortCode varchar(8) [过时,不再插入,但用于遗留数据]

项目:Id bigint (PK)、FeedId bigint (FK)、Title varchar(1000)、Description varchar(1000)、Published datetime、ShortCode varchar(8) [过时,不再插入,但用于遗留数据]、ShortId bigint null [插入后更新为相等的 Id(用于分区)]

FutureItems:Id bigint (PK)、FeedId bigint (FK)、Title varchar(1000)、Description varchar(1000)、Published datetime、ShortCode varchar(8) [过时,不再插入,但用于遗留数据]、ShortId bigint null [插入后更新为相等的 Id(用于分区)]

OldItems:Id bigint (PK)、FeedId bigint (FK)、Title varchar(1000)、Description varchar(1000)、Published datetime、ShortCode varchar(8) [过时,不再插入,但用于遗留数据]、ShortId bigint null [插入后更新为相等的 Id(用于分区)]

因此,如果您的提要大小为 20,您会在 Feeds 表中插入 500 个,然后在 Items 表中插入 10000 个,然后更新运行以将 ShortId 设置为等于 Id。每晚一次,将运行一个作业,将数据分离到其他两个表中,并将未来的项目转移到 Items 表中。

我读到 SqlBulkCopy 可以在几分钟内完成 2000 万行,但我找不到任何使用 FK 约束将其放入多个表的好例子。

我们的 SQL 服务器是一个“怪物”,特别是对于这个应用程序。它是 SQL 2008 R2 Web、Windows 2008 R2 Enterprise、12GB 内存、双 4 核 Xeons @ 2.8ghz。

我们的 Web 服务器是没有数据库服务的克隆。

插入链接时 CPU 运行约 85%,数据库填满 RAM。

如果 SqlBulkCopy 不好,欢迎提出任何建议,我们有付费的客户很生气,我不是 DBA,只是一个普通的老程序员。

4

2 回答 2

1

SqlBulkCopy 确实比普通插入要快。但是更快,因为它可以将每秒运行 1000 次插入的作业转换为每秒运行 10000 次的作业。如果您只能在 10 分钟内完成 10000 个链接,那么您肯定遇到了不同的问题,这是批量复制不太可能解决的问题。

您需要首先调查为什么插入 10000 个链接需要如此长的时间。只有在您了解这一点后,您才能进行调用以确定迁移到 SqlBulkCopy 是否是一种解决方案。我知道您不是 DBA,但我将为您提供一份用于解决 SQL Server 性能问题的“dbaish”白皮书:Waits and Queues。这不是一个千篇一律的解决方案,实际上是一种方法,可以教您如何识别 SQL Server 中的性能瓶颈。

并解决您的问题:当有约束时如何使用 SqlBulkCopy?更普遍的问题是当约束到位时如何进行批量插入操作?对于严重的卷,实际上禁用约束,执行批量上传,然后启用约束。为了以最少的停机时间进行更简化的在线操作(在禁用约束期间数据库基本上“关闭”),可以使用不同的策略,即将数据预加载到临时表中,对其进行验证,然后使用分区切换操作,请参阅使用分区切换高效传输数据

于 2011-01-18T22:59:08.693 回答
0

我认为您仅使用普通批量插入的真正问题是您需要其他表的初始插入中的提要 ID。这就是我要做的。使用批量插入插入临时表。然后使用存储过程以基于集合的方式对真实表进行插入。您可以在对 feed 表的初始插入中使用 output 子句来取回一个 table 变量,其中包含插入其他表所需的 feed id。

于 2011-01-18T22:36:28.443 回答