使用SqlBulkCopy插入行

linq-to-sql sqlbulkcopy sql-server transactions

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

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

结构非常基础。

提要 :Id bigint(PK),标题varchar(1000),描述varchar(1000),发布日期时间,聚合日期时间null,ShortCode varchar(8)[过时,不再插入,但用于遗留数据]

项目 :Id bigint(PK),FeedId bigint(FK),标题varchar(1000),描述varchar(1000),发布日期时间,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),标题varchar(1000),描述varchar(1000),发布日期时间,ShortCode varchar(8)[过时,不再插入,但用于遗留数据],ShortId bigint null [插入后更新为等于Id(用于分区)]

因此,如果您的Feed大小为20,则会在Feeds表中获得500个插入,然后将10000个插入到Items表中,然后更新运行以将ShortId设置为Id。每晚一次,作业运行将数据分成另外两个表,并将未来的项目转移到Items表中。

我读到SqlBulkCopy可以做几千万行,但我找不到任何好的例子,用FK约束进入多个表。

我们的SQL服务器是一个“怪物”,尤其适用于此应用程序。它是SQL 2008 R2 Web,Windows 2008 R2 Enterprise,12GB Ram,双核4 Xeons @ 2.8ghz。

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

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

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

一般承认的答案

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

您需要首先调查为什么插入10000个链接所需的时间非常长。只有在您了解之后才能进行调用以确定是否转移到SqlBulkCopy是一种解决方案。我知道你不是一名DBA,但我会指导你一本'dbaish'白皮书来解决SQL Server性能问题: 等待和队列 。这不是一个cookie切割器配方解决方案,实际上是一种方法,将教你如何识别SQL Server中的性能瓶颈。

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


热门答案

我认为你使用普通批量插入的真正问题是你需要来自其他表的初始插入的feed ID。这就是我要做的。使用批量插入插入登台表。然后使用存储过程以基于集合的方式对真实表进行插入。您可以将初始插入中的输出子句用于提要表,以获取表变量,其中包含插入其他表所需的提要ID。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因