C# 在大量记录上循环
我有一个位于网络中的postgre服务器,我正在处理数据库。 我需要检查大量记录(1mil+),每次选择都需要时间 这是我目前的方法: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(
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);
});