1

我正在尝试使用任务并行库(.Net 4.5)优化 ADO .NET(.Net 4.5)数据访问,例如,当从数据库中选择 1000,000,000 条记录时,我们如何才能有效地使用机器多核处理器与任务并行图书馆。如果有人发现使用完整的资源来获得一些想法,请发布:)

4

1 回答 1

4

以下适用于所有 DB 访问技术,而不仅仅是 ADO.NET。

客户端处理通常是解决数据访问问题的错误场所。通过优化架构、创建适当的索引和编写适当的 SQL 查询,您可以将性能提高几个数量级。

当正确的查询可以返回重要的 2-3 条记录时,为什么要通过具有显着延迟的有限网络连接将 1M 记录传输到客户端进行处理?

RDBMS 系统旨在利用可用的处理器、RAM 和磁盘阵列尽可能快地执行查询。与客户端计算机相比,数据库服务器通常具有更多的 RAM 和更快的磁盘阵列。

您要进行哪种类型的处理?您是否正在尝试分析交易数据?在这种情况下,您应该首先将数据提取到报告中,或者更好的是 OLAP 数据库。具有适当索引和预先计算分析的星型模式可以比用于分析的 OLTP 模式快 1000 倍。

改进的 SQL 编码还可以带来 10 到 50 倍或更多的改进。不习惯 SQL 的程序员的一个典型错误是使用游标而不是集合操作来处理数据。这通常会导致可怕的性能下降,大约是 50 倍甚至更糟。

将所有数据拉到客户端逐行处理更糟糕。这本质上与使用游标相同,只是数据必须通过网络传输,并且处理必须使用客户端通常有限的内存。

异步处理提供任何优势的唯一地方是当您想要在处理完成时触发长操作并执行代码时。ADO.NET 已经使用 APM 模型 (BeginExecute/EndExecute)提供了异步操作。您可以使用 TPL 将其包装在一个任务中以简化编程,但您不会获得任何性能改进。

可能是您的问题根本不适合数据库处理。如果您的算法要求您多次扫描整个数据集,最好一次将所有数据提取为合适的文件格式,然后将其传输到另一台机器进行处理。

于 2012-12-17T08:20:53.317 回答