我正在切换我的一些 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,只是一个普通的老程序员。