c# - 遍历大量记录

标签 c# winforms performance postgresql query-optimization

我有一个位于网络中的 postgre 服务器,我正在使用数据库。 我需要检查大量记录(超过 100 万条),每次选择都需要时间。

这是我目前的方法:

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++; 
}); 

但是当 DB 大小增加时,这种方法(在我看来)将不会那么有效。你能建议一个更好的方法吗?也许拉取数据以分块处理;虽然我现在不知道如何管理它。

最佳答案

优化要点:

  • 创建命名类型,并使用 ADO.NET 读取命名类型,而不是使用 DataSetDataTable,这将减少一些内存占用。<
  • 只拉取您实际需要使用的记录(您并不经常需要引入超过一百万条记录,但我们不知道您的业务逻辑)

澄清您的原始帖子的问题:

  • 您有什么理由说明这在未来无法扩展吗?
  • 您如何处理利用 Parallel.ForEach 的优势?只要底层系统具备它的能力,您可能就会对现在的方法感到满意。还请考虑,您可能应该分析实际性能,而不是仅仅猜测会发生什么。
DataSet ds = new psqlWork().getDataSet(@"
  SELECT * FROM z_sitemap_links 
  order by timestamp asc /*always order when skipping records so you get the same skips */
  LIMIT 100000 /* using these two with variables you could skip so many records /*
  OFFSET 100000 /* depending on what you're aiming for */
"); 
DataTable dt = ds.Tables[0]; 
Parallel.ForEach(dt.AsEnumerable(), dr => 
{ 
    new Sitemap().runSitemap(dr[1].ToString(), counter); 
    counter++; 
}); 

并且,如果您可以使用类似这样的方法:row_number() OVER (ORDER BY col1) AS i 那么您可以跳过计数器,因为在您选择行时会为您提供该计数器回来了,但我的 postgres 知识并没有告诉我上面的代码每次都是 1..100000,或者它是否是你想要的,但是那些人在 Database Administrators肯定会知道。这意味着您的代码将变为:

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

关于c# - 遍历大量记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11462096/

相关文章:

c# - 枚举表达式列表以过滤集合

winforms - 如何避免在* .designer.cs和* .resx中进行不必要的更改?

C#获取窗体某个位置的控件

javascript - 这个问题有没有合适的数据结构或者优化?

java - mysql插入查询性能

c# - 获取 C# 字符串中字符的 ASCII 值

c# - 适用于 Windows x64 上大文件的良好 ISAM 库或其他简单文件管理器

c# - 在RelativeLayout中动态绑定(bind)多个图像与MVVM?

c# - 是否可以禁用 OpenFileDialog 取消按钮?

android - Flutter - initState() 中的复杂函数会降低导航和性能