And*_*rew 0 c# postgresql performance query-optimization winforms
我有一个位于网络中的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++;
});
Run Code Online (Sandbox Code Playgroud)
但是当数据库大小增加时,这种方法(在我看来)不会那么有效.你能建议一个更好的方法吗?也许把数据拉成块来处理; 虽然我现在不知道如何处理这个问题.
优化要点:
DataSet和DataTable,这将减少一些内存占用.澄清原帖的问题:
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++;
});
Run Code Online (Sandbox Code Playgroud)
而且,如果你可以利用这样的:row_number() OVER (ORDER BY col1) AS i那么你可以跳过柜台,因为这将是提供给你,你选择行回来了,但我的Postgres的知识并没有告诉我,如果这将是1..100000每次从上面的代码,或者如果它将是你想要的,但数据库管理员的人肯定知道.这意味着您的代码将成为:
Parallel.ForEach(recordList, record =>
{
new Sitemap().runSitemap(record.FieldYouNeed, record.RowNumberFromDatabase);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |