【问题标题】:How to indicate the current progress of querying a large dataset?如何指示查询大数据集的当前进度?
【发布时间】:2012-02-28 03:24:22
【问题描述】:

我想使用进度条来显示当前进度% 数据行已加载。我看到similiar question 已在 SO 中被问到,但解决方案只是建议使用选取框样式。

例如,我运行一个查询大型数据表的 Select 语句,这可能需要几秒钟。 我希望进度条更新查询的当前进度。这可能吗?

我知道我需要的东西很少:

  1. 将检索总记录计数。 (可以先Select count(1)获取)
  2. 一些通知告诉我刚刚检索了多少条记录。

对于2.是我不知道如何实现的部分。

我可以考虑将其拆分为情侣查询,但这可能并非一直都可行。

但是在 SQL 中与Cursor 类似的东西怎么样?要求 SQL Server 查询一个块并重复返回数据。

for loop{
    //query a chunk of records

    //return 

    //Next
}

所以我可以计算进度并将它们填充到单个DataTable

上面可以做点什么吗?如果有,怎么做?

因为我看到一个 ASP.NET 应用程序能够显示加载大型数据表的进度,所以我想在 WPF 中实现同样的事情。

【问题讨论】:

  • 您使用什么进行数据访问:ORM、Web 服务、ADO.NET 等?你的后端服务器是什么?
  • @oleksii 我正在使用实体框架,但我认为这对于 ORM 可能很困难。所以我正在考虑使用 ADO.NET 通过 SQL Server 来实现这一点。
  • @KingChan,你确定有进度条值得不用ORM吗?
  • @oleksii 实际上,对于我正在实现的模块,无论如何都必须使用 ADO.NET。它需要运行用户定义的动态 SQL 语句。

标签: c# sql progress-bar


【解决方案1】:

如果您将整个表加载到内存中,您可能会做错。用户真的需要所有这些数据吗?有多少用户会同时查询数据库?您确定用户将使用整个表格吗?

如果您对所有这些问题的回答是,那么您可以考虑使用分页模式:跳过 + 采取,您可以提高进度使用 skip/take/total 值更新事件。

//META CODE
var dataTable = new List<DataTable>(); //in-memory storage
int rowCount = [...].Rows.Count(); //this is fast check with database
int current;

while (current < rowCount)
{
  var fetchedData = [...].Skip(current).Take(1000).ToList();
  dataTable.AddRange(fetchedData);
  current = dataTable.Rows.Count();

  //fire progress update event
}

【讨论】:

  • 这是您访问实际数据库的方式,通过 EF、SqlDataReader 或其他任何方式(请原谅我的语法,这只是为了说明一个想法)
【解决方案2】:

首先,您需要确定将查询分成两部分不会使您的查询时间加倍。您可能会发现自己在获得记录计数之前等待了几秒钟,而您还没有解决任何问题。

可以并行执行这两个查询(数据库喜欢并发并很好地处理它),但是您会给数据库带来额外的负担,这可能会成为未来的可扩展性问题.

至于分块查询,我相信SqlDataReader 将允许您在记录可用时获取记录,而无需先等待整个查询完成。不过,您必须自己将它们添加到 DataTable 中。

【讨论】:

  • +1 我选择这个作为答案,因为它最适合我的问题。
【解决方案3】:

如果您查询当前数据集的计数,它将遍历所有行。这几乎和获取它一样慢。您可以尝试通过 sql 语句选择计数。 例如:"SELECT COUNT(ID_COLUMN) FROM TABLE WHERE ..."。这是您必须执行的另一个 sql 语句,但比询问数据集的计数要快。
有一个 C# 进度条控件。您只需要设置一个最大值,每次迭代循环时,您都可以调用函数 step()。它将使进度条提前一步;) 不用你做百分比计算。

【讨论】:

  • +1。这解决了“下载 i 百万行需要很长时间”的问题,而不是“查询很慢”的问题。相反 - 它使用繁重的查询两次访问服务器。人们会因为这种优化而被解雇。
  • 据我所知,这是将进度条与 sql 数据集一起使用的最佳方式。我期待着学习更好的解决方案!
  • @gimbar 你能详细说明select a count by sql statement是什么意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多