【问题标题】:Parallel sql queries without Task Parallel Library?没有任务并行库的并行 sql 查询?
【发布时间】:2015-03-30 10:33:54
【问题描述】:

我的任务是优化一个相当繁重的查询(约 10 000 行)。我想使用多线程,所以每个线程处理并返回特定范围的数据,例如我创建3个线程。 第一个线程处理并返回前 100 行, 第 2 - 接下来 100 行, 第三 - 下 100 行 当一个线程完成它的工作时,它需要接下来的 100 行,以此类推,直到没有更多数据要返回。

我读过 TPL,但它自 .NET 4.0 以来一直是本机功能,但我的项目基于 3.5。我还阅读了 Reactive 库,它具有适用于 .NET 3.5 的 TPL 功能,但无法让它为我工作。

归结为:如何将查询分解成可以由多个线程执行的部分? (可能在循环中)

P.S 我更喜欢 LINQ,但也可以接受简单的文本脚本

【问题讨论】:

  • 不是一个繁重的查询,如果花费的时间太长,你应该检查你的索引和SQL语句。
  • 我正在处理的任务将成为具有数百万行的真实实时软件的基础。我同意你的看法,10k 真的没那么重。这段代码必须能够处理更繁重的查询:)
  • 重查询最好由数据库服务器处理。为什么要拉取客户端的所有数据进行处理?如果您有 ETL 方案,为什么不使用 SSIS?它就是为此目的而构建的
  • 说实话,我什至不知道这玩意儿要干什么。但它不适用于 ETL 过程。我只是被赋予了一项任务来找出 .NET 3.5 上的并行查询(并提高我对 SQL 的了解,我猜),仅此而已:)
  • 我建议您了解一下它将如何使用以及parallel queries 的含义。它会产生很多的不同

标签: sql .net multithreading linq parallel-processing


【解决方案1】:

所以经过一番修改后,我找到了一种非常基本的方法,可以在 .NET Framework 3.5 上实现不使用 TPL 的多线程查询处理

我的做法:

  • 获取表的总行数
  • 批量大小 = 行数/线程数
  • 创建线程,以便每个线程根据批处理大小获得特定的行子集。 SQL servers < 2012 Here2012+ Here 的信息 (例如:表有 300 行,我们使用 3 个线程,每个线程将返回一批 100 行)
  • 启动所有线程并等待它们完成(我使用了一个标志)
  • 处理线程
  • 在编写连接字符串或数据库连接配置时不要忘记添加“MultipleActiveResultSets=True”(MARS)。这将允许单个连接上的多个批次

这个对我来说效果很好。如果您对如何在 .NET 3.5 上进行多线程查询有更好的想法,请对此发表评论

【讨论】:

  • 为什么要在客户端这样处理结果呢? 10k 是一个 small 结果集,根本不需要分页。一个非常快速和肮脏的解决方案是将所有数据加载到内存中,然后使用多个线程来处理它。 “并行查询”仅对 TB 大小的加载操作有意义
  • @PanagiotisKanavos 在问题 cmets 中回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多