C#中处理大型数据集的最佳实践

6

我目前正在设计和实现一个软件,该软件需要对两个具有主从结构的表执行CRUD操作。其中,Header表有大约50万行数据,而Detail表有约100万行数据。

将所有这些数据填充到数据集中是不可行的,因为数据可能会发生更改,我也不想在本地拥有数据库的副本。我希望软件运行流畅。尽管使用数据集可能并不是最佳解决方案,但我应该使用它以与其他软件部分保持一致。

起初,我考虑使用TypedDataSet和一些方法,如GetNext()、GetFirst()、GetByCod(),但我不确定是否是最佳解决方案...我正在进行一些小测试,但效果并不太好。

我很想知道其他开发人员是如何处理这个问题的,他们使用的最佳实践和处理大量数据的"最佳选择"是什么。

我正在使用Visual Studio 2008和Sql Server 2005。

添加:当你谈论使用SqlDataReader时,你是指像这样的东西吗?

using (SqlConnection con = new SqlConnection(CON)) {

            con.Open();
            SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE");
            cmd.Connection = con;
            SqlDataReader rd = cmd.ExecuteReader();
            BindingSource bindingSource = new BindingSource();
            bindingSource.DataSource = rd;
            bindingNavigator1.BindingSource = bindingSource;

            txtFCOD.DataBindings.Add("Text", bindingSource, "FIELD");
        }

1
首先,我不会使用数据集。为什么要一次性查询所有行呢?当你需要处理大量数据时,我会使用数据阅读器;当你需要提供一个简单的接口时,我建议使用对象-关系映射器(OR Mapper)。 - Boas Enkler
是的,我同意Boas Enkler的观点。只在需要时查询所需数据。 - Sai Kalyan Kumar Akshinthala
在查询中请注意使用表上的索引,并且只在查询中要求特定的信息。让数据库去完成它的工作 :-) - Schwarzie2478
为什么你需要在客户端存储这么多数据? - Kamil
2个回答

5

我认为没有办法管理如此庞大的数据集。

你需要使用 DataReader,而不是 DataSet。

拥有真正大量数据的本地数据库是达到这个目的(应用程序快速响应)的有效方法,但您将面临同步(复制)、并发等问题。

最佳实践是仅从服务器获取用户真正需要的数据。您必须使用服务器端处理,例如存储过程等。

我仍然不知道您想要操作哪些数据以及您的应用程序的目的,但在客户端上使用大量数据的另一个缺点是,您的应用程序将需要大量的内存和快速的CPU。也许您的计算机足够快并且能够处理此问题,但请考虑如果有人在配备 1GHz Atom CPU 的平板电脑上安装您的应用程序会发生什么情况。那将是一场灾难。


@arturn 你想用这个大数据集做什么? - Andrew Jackman
我正在做一个CRUD主从表单。 - arturn
表单有数百万行?这太疯狂了。 - Kamil

4
很少有情况需要一次检索所有数据。您可以考虑以下内容:
- 使用视图提供特定较小数据集。 - 考虑使用在SQL Server 2005中引入的OVER()功能进行分页。 - 不要使用数据集处理大量数据。在这种情况下,DataReaders更有效率。
我个人认为,除非您完全控制正在加载多少数据以及何时处置其,否则应避免将大量数据加载到内存中。请记住,如果在服务器端处理数据,则会使用其他进程可能需要的资源。
您应该始终尝试一次处理较小的块,并且最好尽可能短时间。这可以防止您的进程长时间占用任何资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接