linq和parallelism - SQL Server

时间:2013-06-17 08:01:19

标签: c# sql sql-server linq linq-to-entities

我遇到了LINQ To Entities的问题。

如果我运行我的LINQ查询,那么它会在执行计划中使用 Parallelism(Gather Streams and Reparation Stream),这会导致大量的CXPACKET等待。

但是,如果我将LINQ翻译的查询(我通过ToTraceString函数获得)直接运行到我的sql server,那么执行计划不包含并行性。

为什么在通过LINQ运行SQL与SQL查询本身时,SQL的并行性存在差异?

我如何克服这个问题?我希望我的LINQ查询运行方式与直接运行SQL时的运行方式相同。

执行计划示例:

使用LINQ: using linq

直接SQL:

without linq - sql directly

我可以发布我的SQL查询,但我不认为它可以帮助...

1 个答案:

答案 0 :(得分:0)

CXPACKET实际上是否有问题?

当SQL Server收到查询时,它会对其进行优化。如果查询的估计成本大于并行度的成本阈值,则它将考虑并行查询。如果并行化了太多查询,则始终可以提高此阈值。

我想知道实体框架查询与您的查询之间是否存在任何差异,这可能会推高估算成本。

无论哪种方式,CXPATCKET等待都不是问题。它们是任何并行查询的自然组成部分,我们不会为具有多个线程的四核服务器支付额外费用,因此我们可以在一系列中运行所有内容。另一件要检查的是网络。

通过网络传输IO时,如果返回一堆结果,则可能需要更多时间。这就是为什么在SQL Server Management工作室中运行查询可以快速返回,但是从另一台服务器查询可能需要一段时间。