【问题标题】:Adding MAXDOP to Linq to Entities将 MAXDOP 添加到 Linq to Entity
【发布时间】:2011-04-28 12:16:43
【问题描述】:

我正在寻找 linq to entity 扩展,它允许将 OPTION(MAXDOP x) 添加到生成的查询中。对于查询,我想限制他们的 SQL Server 资源。

类似:

Customers.WithMaxDop(2).Where(...) ..

找不到。 在我尝试深入创建自己的扩展程序之前,我想先向你们寻求帮助 - 你们建议如何做?

谢谢!

【问题讨论】:

    标签: sql-server entity-framework linq-to-entities


    【解决方案1】:

    即不能通过扩展方法添加的查询提示。您必须构建全新的 EF 提供程序或将带有提示的查询包装到数据库视图中,并将视图映射为新的只读实体。

    EF 是数据库(理论上任何数据库)之上的抽象——它不应该让您控制这些数据库细节。如果您需要这些详细信息,则必须在数据库层对它们进行编码,并且只向 EF 公开视图或存储过程。

    【讨论】:

    • 您好,谢谢您的回复。这个解决方案中的技巧怎么样:aneyfamily.com/terryandann/post/2008/04/… - 捕获生成的 sql 文本,然后通过注入提示 OPTION(..) 来操作它,然后才运行查询.. 虽然后来我将结果作为实体丢失。
    • 这将是一个非常大的解决方法,它就像通过context.ExecuteStoreQuery 执行您自己的自定义 SQL 查询一样 - 您将失去像渴望加载这样的功能。您可以通过将查询转换为ObjectQuery 并使用ToTraceString 来生成SQL。请注意,EF 有时会创建非常大的查询,因此解析和修改此类查询可能非常复杂、容易出错且操作缓慢。
    • 在我用 EF 转过的任何地方我都被关闭了。我正在查询 DBops 人员真正需要的数据(maxdop 2)或某种 nolock。当当当当……
    • 这是一篇关于 MAXDOP 和并行性成本阈值的有趣文章。后者可能是一个不那么严厉的解决方案:[sql-server-performance.com/2014/maximum-degree-parallelism/]
    【解决方案2】:

    现在似乎可以使用 EF Core 3.x。 您可以在操作之前和/或之后在低级别“拦截数据库操作”。在 Microsoft 提供的示例中,他们在查询末尾添加了提示。

    command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
    

    但是,我不知道这是否会发生在每个操作中,或者您是否可以将这些拦截仅应用于选定的命令。 更多信息在这里:https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/#interception-of-database-operations

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多