如何指出查询大型数据集的当前进度?

时间:2012-02-27 19:00:40

标签: c# sql progress-bar

我想使用进度条显示已加载数据行的当前进度%。我看到similiar question已被问到,但解决方案只是建议使用字幕样式。

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

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

  1. 将检索总记录数。 (可以先通过选择计数(1)获得)
  2. 告诉我刚检索了多少条记录的一些通知。
  3. 对于2.是我不知道如何实现的部分。

    我可以想到将它拆分成情侣查询,但这可能无法一直存在。

    但是在SQL中Cursor类似的东西呢?让SQL Server查询一个块并重复返回数据。

    for loop{
        //query a chunk of records
    
        //return 
    
        //Next
    }
    

    所以我可以计算进度并将它们填入一个DataTable

    可以做一些上面的事吗?如果是这样,怎么样?

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

3 个答案:

答案 0 :(得分:2)

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

如果你回答所有这些问题,你可以考虑使用分页模式:跳过 + 选择,你可以提升进度使用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
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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