繁体   English   中英

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

[英]What is the fastest way to download rows from two related tables in packs?

两个大型相关表存在一些问题。 第一个大约有100列,第二个大约有300列。外键在5列上。 1亿行在这些表中没什么特别的。

我的任务是下载所有行,对其进行处理,然后上载。 我需要打包下载这些表(父表中的10000行+第二表中的所有相关行)。

最快的方法是什么?

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

连接这两个表可以下载其他解决方案。 问题在于,然后我必须将行分成两部分,消除重复项,等等。我也不是很清楚此下载的速度。

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

我认为最好的解决方案是首先下载所需的所有行。 因此,将所有1mil行都放入表中,其中Type是表的实际类型。 使用类似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看看C#中的Bulk Update

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

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

在ETL场景中,IO是最大的杀手,因此应避免将数据传输到其他计算机。 连接等待时间是另一个杀手,因此从客户端计算机检索子记录也会降低性能。

适当的SQL语句(例如两个表之间的联接)的性能要比将数据拉到其他计算机然后将其推回要好几个数量级。 此外,数据库可以优化大型选择和更新,因为它可以选择适当的查询和更新策略,并且仅使用选择或更新中实际使用的数据。

最后,在数据大小适中的ETL场景中,应不惜一切代价避免使用NHibernate,EF或Linq to SQL之类的ORM。 映射数千个(少得多的)对象的CPU和内存开销非常大,而没有提供任何好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM