没有任务并行库的并行 sql 查询?
Parallel sql queries without Task Parallel Library?
我的任务是优化一个非常繁重的查询(约 10 000 行)。我想使用多线程,所以每个线程处理并返回特定范围的数据,例如我创建了 3 个线程。
第一个线程处理 returns 前 100 行,
第二 - 接下来的 100 行,
第 3 - 接下来的 100 行
当一个线程完成它的工作时,它需要接下来的 100 行等等,直到没有更多的数据要返回。
我读过有关 TPL 的信息,但它自 .NET 4.0 以来一直是本机功能,但我的项目基于 3.5。我还阅读了 Reactive 库,它具有 .NET 3.5 的 TPL 功能,但无法让它为我工作。
归结为:如何将查询分解成多个线程可以执行的部分? (可能在循环中)
P.S 我更喜欢 LINQ,但也可以接受简单的文本脚本
因此,经过一些修改后,我找到了一种非常基本的方法来在 .NET Framework 3.5 上实现多线程查询处理而无需 TPL
我的做法:
- 获取 table
的总行数
- 批量大小=行数/线程数
- 创建线程,以便每个线程都将根据批大小获得特定的行子集。 SQL servers < 2012 Here and 2012+ Here 的信息
(示例:table 有 300 行,我们使用 3 个线程,每个线程会 return 一批 100 行)
- 启动所有线程并等待它们完成(我使用了一个标志)
- 处理线程
- 不要忘记在编写连接字符串或数据库连接配置时添加 "MultipleActiveResultSets=True" (MARS)。这将允许在一个连接上进行多个批处理
这个对我来说效果很好。如果您对如何在 .NET 3.5 上处理多线程查询有更好的想法,请对此发表评论
我的任务是优化一个非常繁重的查询(约 10 000 行)。我想使用多线程,所以每个线程处理并返回特定范围的数据,例如我创建了 3 个线程。 第一个线程处理 returns 前 100 行, 第二 - 接下来的 100 行, 第 3 - 接下来的 100 行 当一个线程完成它的工作时,它需要接下来的 100 行等等,直到没有更多的数据要返回。
我读过有关 TPL 的信息,但它自 .NET 4.0 以来一直是本机功能,但我的项目基于 3.5。我还阅读了 Reactive 库,它具有 .NET 3.5 的 TPL 功能,但无法让它为我工作。
归结为:如何将查询分解成多个线程可以执行的部分? (可能在循环中)
P.S 我更喜欢 LINQ,但也可以接受简单的文本脚本
因此,经过一些修改后,我找到了一种非常基本的方法来在 .NET Framework 3.5 上实现多线程查询处理而无需 TPL
我的做法:
- 获取 table 的总行数
- 批量大小=行数/线程数
- 创建线程,以便每个线程都将根据批大小获得特定的行子集。 SQL servers < 2012 Here and 2012+ Here 的信息 (示例:table 有 300 行,我们使用 3 个线程,每个线程会 return 一批 100 行)
- 启动所有线程并等待它们完成(我使用了一个标志)
- 处理线程
- 不要忘记在编写连接字符串或数据库连接配置时添加 "MultipleActiveResultSets=True" (MARS)。这将允许在一个连接上进行多个批处理
这个对我来说效果很好。如果您对如何在 .NET 3.5 上处理多线程查询有更好的想法,请对此发表评论