C# 在大量记录上循环

C# 在大量记录上循环,c#,winforms,performance,postgresql,query-optimization,C#,Winforms,Performance,Postgresql,Query Optimization,我有一个位于网络中的postgre服务器,我正在处理数据库。 我需要检查大量记录(1mil+),每次选择都需要时间 这是我目前的方法: DataSet ds = new psqlWork().getDataSet("SELECT * FROM z_sitemap_links"); DataTable dt = ds.Tables[0]; Parallel.ForEach(dt.AsEnumerable(), dr => { new Sitemap().runSitemap(

我有一个位于网络中的postgre服务器,我正在处理数据库。 我需要检查大量记录(1mil+),每次选择都需要时间

这是我目前的方法:

DataSet ds = new psqlWork().getDataSet("SELECT * FROM z_sitemap_links"); 
DataTable dt = ds.Tables[0]; 
Parallel.ForEach(dt.AsEnumerable(), dr => 
{ 
    new Sitemap().runSitemap(dr[1].ToString(), counter); 
    counter++; 
}); 

但是,当数据库大小增加时,这种方法(在我看来)就没有那么有效了。你能建议一个更好的方法吗?可能是将数据分块处理;尽管我现在不知道如何管理它。

优化要点:

  • 创建命名类型,并使用ADO.NET读取命名类型,而不是使用
    DataSet
    DataTable
    ,这将减少一些内存占用
  • 只拉取您实际需要处理的记录(您通常不需要引入超过一百万条记录,但我们不知道您的业务逻辑)
澄清你原来帖子的问题:

  • 您是否有理由认为这在未来无法扩展
  • 您是如何处理利用并行.ForEach的?只要底层系统有足够的能力,您可能会对现在的方法感到满意。考虑一下,你可能应该对实际的性能进行剖析,而不是仅仅猜测会发生什么。
而且,如果你能像我一样利用这样的东西:
row_number()(按col1排序),那么你可以跳过计数器,因为当你选择返回的行时,计数器会提供给你,但是我的postgres知识并不能告诉我,从上面的代码中,每次是1..100000,还是你想要的,但是那边的人肯定知道。这意味着您的代码将变成:

Parallel.ForEach(recordList, record => 
{ 
    new Sitemap().runSitemap(record.FieldYouNeed, record.RowNumberFromDatabase);
}); 

“从z_sitemap_链接中选择*”您真的需要所有列吗?在大型数据库上永远不要选择*
。是的,表仅包含链接;没别的了只有一个专栏?然后只选择一列。另外,请参阅下面我的笔记,并给出适当的反馈。+1。特别是对于澄清的好观点。“(在我看来)”文章中的度量并不是很有说服力的论点,即代码需要优化(或者甚至使用Parallel.ForEach来完成潜在的I/O绑定任务)。
Parallel.ForEach(recordList, record => 
{ 
    new Sitemap().runSitemap(record.FieldYouNeed, record.RowNumberFromDatabase);
});