Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有任务并行库的并行sql查询?_Sql_.net_Multithreading_Linq_Parallel Processing - Fatal编程技术网

没有任务并行库的并行sql查询?

没有任务并行库的并行sql查询?,sql,.net,multithreading,linq,parallel-processing,Sql,.net,Multithreading,Linq,Parallel Processing,我的任务是优化一个相当繁重的查询(~10000行)。我想使用多线程,因此每个线程都处理并返回特定范围的数据,例如,我创建了3个线程。 第一个线程处理并返回前100行, 第二排-接下来的100排, 第3排-下100排 当一个线程完成它的工作时,它需要下一个100行,以此类推,直到不再返回数据为止 我读过关于TPL的文章,但它自.NET4.0以来一直是本机功能,但我的项目是基于3.5的。我还读到了关于反应式库的文章,该库具有针对.NET3.5的TPL功能,但我无法让它为我工作 它可以归结为:如何将查

我的任务是优化一个相当繁重的查询(~10000行)。我想使用多线程,因此每个线程都处理并返回特定范围的数据,例如,我创建了3个线程。 第一个线程处理并返回前100行, 第二排-接下来的100排, 第3排-下100排 当一个线程完成它的工作时,它需要下一个100行,以此类推,直到不再返回数据为止

我读过关于TPL的文章,但它自.NET4.0以来一直是本机功能,但我的项目是基于3.5的。我还读到了关于反应式库的文章,该库具有针对.NET3.5的TPL功能,但我无法让它为我工作

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


另外,我更喜欢LINQ,但是一个简单的文本脚本也是可以接受的

,所以经过一些修改后,我找到了一个非常基本的方法来实现多线程查询处理,而无需.NET Framework 3.5上的TPL

我的做法:

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

这个对我来说很好用。请对此发表评论,如果您对如何在.NET 3.5上进行多线程查询有更好的了解,那么这不是一个繁重的查询,如果它花费的时间太长,您应该检查您的索引和SQL语句。我正在处理的任务将是一个具有数百万行的实时软件的基础。我同意你的看法,10公里其实没那么重。这段代码必须能够处理更繁重的查询:)繁重的查询最好由数据库服务器处理。为什么要提取客户端上的所有数据进行处理?如果您有一个ETL场景,为什么不使用SSI呢?它就是为了这个目的而建的老实说,我甚至不知道这东西会被用来做什么。但它不会用于ETL过程。我的任务是在.NET3.5上解决并行查询(我想这会提高我对SQL的了解),仅此而已:)我建议您了解它将如何使用,以及它们所指的
并行查询
的含义。这有很大的不同为什么你想在客户端像这样处理结果?10k是一个小的结果集,根本不需要分页。一个非常快速且肮脏的解决方案是加载内存中的所有数据,然后使用多个线程来处理它。“并行查询”仅对TB大小的加载有意义operations@PanagiotisKanavos在问题评论中回答