1

我需要将多个 sql 语句从 SQL Server 加载到 DataTables 中。大多数语句返回大约 10.000 到 100.000 条记录,每条记录最多需要几秒钟的时间来加载。我的猜测是,这仅仅是由于需要推送的数据量。声明本身不需要太多时间来处理。

所以我尝试使用 Parallel.For() 来并行加载数据,希望整体处理时间会减少。我确实获得了 10% 的性能提升,但这还不够。一个原因可能是我的机器只是一个双核,因此限制了这里的好处。不过,将部署该程序的服务器有 16 个内核。

我的问题是,我如何才能进一步提高性能?使用异步数据服务查询会是比 PLINQ 更好的解决方案(BeginExecute 等)吗?或者也许其他一些方法?

SQl 服务器在同一台机器上运行。在部署服务器上也是如此。

编辑:我使用 DataReader 而不是 DataTable 运行了一些测试。这已经将加载时间减少了大约 50%。伟大的!我仍然想知道如果使用多处理器机器,使用 BeginExecute 进行并行处理是否会改善整体加载时间。有人有这方面的经验吗?感谢您对此的任何帮助!

更新:我发现处理 sql 语句消耗了大约一半的加载时间。在 SQL Server Management Studio 中,这些语句只花费了一小部分时间,但不知何故,它们通过 ADO.NET 花费了更长的时间。因此,通过使用 DataReaders 而不是加载 DataTables 并调整 sql 语句,我已经降低了大约 25% 的初始加载时间。使用 Parallel.For() 在并行线程中加载 DataReader 并没有改进。所以现在我对结果很满意,就这样吧。也许当我们更新到 .NET 4.5 时,我会尝试加载异步 DataReader。

4

3 回答 3

1

我的猜测是,这仅仅是由于需要推送的数据量。

不,这是由于使用了 SLOW 框架。在我的一个应用程序中,我在不到 5 秒的时间内将近一百万行放入字典中。数据表很慢。

于 2012-11-23T17:29:00.730 回答
1

你必须改变问题的性质。老实说,每个请求谁需要查看 10.000 到 100.000 条记录?我认为没有人。

您需要考虑处理分页,在您的情况下,分页应该在 sql server 上完成。为了清楚起见,假设您有一个名为“GetRecords”的存储过程。修改此存储过程以接受页面参数并仅返回与特定页面相关的数据(假设仅 100 条记录)和总页数。内部应用程序只显示这 100 条记录(它们会飞)并处理选定的页面索引。

希望这会有所帮助,最好的问候!

于 2012-11-23T20:57:33.670 回答
0

您是否经常需要加载这些请求?如果是这样,为什么不使用分布式缓存?

于 2012-11-23T17:08:22.903 回答