我有两个大型相关表格存在问题。 第一列有大约100列,第二列约300列。外键有5列。 在这些表中,1亿行并不特别。
我的任务是下载所有行,处理它们然后上传。我需要在包中下载这些表(父表中的10000行+所有与第二表中的行相关的行)。
最快的方法是什么?
最简单的解决方案是从父表中下载10000行,然后迭代它们以下载相关的行。很简单,但我认为它不会很快。
可以通过加入这两个表来下载其他解决方案。问题是,我必须将行分成两部分,消除重复等等。我也不知道这次下载有多快。
所以,我的问题与标题中的问题相同。从包中的相关表中下载大量数据的最快方法是什么?
答案 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和内存开销很大,但没有提供任何好处。