从包中的两个相关表中下载行的最快方法是什么?

时间:2014-08-08 09:10:31

标签: c# sql-server ssis etl

我有两个大型相关表格存在问题。 第一列有大约100列,第二列约300列。外键有5列。 在这些表中,1亿行并不特别。

我的任务是下载所有行,处理它们然后上传。我需要在包中下载这些表(父表中的10000行+所有与第二表中的行相关的行)。

最快的方法是什么?

最简单的解决方案是从父表中下载10000行,然后迭代它们以下载相关的行。很简单,但我认为它不会很快。

可以通过加入这两个表来下载其他解决方案。问题是,我必须将行分成两部分,消除重复等等。我也不知道这次下载有多快。

所以,我的问题与标题中的问题相同。从包中的相关表中下载大量数据的最快方法是什么?

2 个答案:

答案 0 :(得分:0)

我认为这里最好的解决方案是先下载所需的所有行。所有1mil行并将它们放入List中,其中Type是Table的实际类型。这可以使用像NHibernate这样的框架轻松完成,您可以将数据库结构映射到类。

一旦你拥有了那个,你可以继续这样的事情: 您有多个批次,每批次可以说10,000个。

    int totalCount = LIST.Count;
                int batchSize = 10000;
                int numberOfBatches = (int)Math.Ceiling((decimal)totalCount / batchSize);

     for (int i = 0; i < numberOfBatches; i++)

                    {
    var currentBatch = LIST.Skip(i * batchSize).Take(batchSize);

CONTENT HERE.

}

所以基本上你将在数据库中一次更新x行数。我强烈建议您使用NHibernate而不是SQLReader / Writers,因为它们更有效率,而插入/更新/删除等任务变得微不足道。

编辑: 作为NHibernate Update的替代,您可以使用BulkUpdate 看看Bulk Update in C#

答案 1 :(得分:0)

最快的方法是使用SSIS等ETL工具处理服务器上的数据,而不将其传输到其他计算机。

SSIS允许对具有许多内置操作甚至C#脚本的数据流进行批处理,按行处理,执行监视,处理脏数据等。

在ETL方案中,IO是最大杀手,因此应避免将数据传输到其他计算机。连接延迟是另一个杀手,因此从客户端计算机检索子记录也会破坏性能。

正确的SQL语句(如两个表之间的连接)将比将数据拉到其他计算机然后将其推回更好。此外,数据库可以优化大型选择和更新,因为它可以选择正确的查询和更新策略,并仅使用实际用于选择或更新的数据。

最后,在ETL场景中应该不惜一切代价避免使用像NHibernate,EF或Linq to SQL这样的ORM,即使是适度的数据大小。映射数千(数百万)对象的CPU和内存开销很大,但没有提供任何好处。