【问题标题】:Does SQL server generate an execution plan every time when querying data with Entity FrameworkSQL Server每次使用Entity Framework查询数据时是否都会生成一个执行计划
【发布时间】:2019-05-16 06:57:47
【问题描述】:

我知道 EF 在应用程序级别对执行计划进行了一些缓存,但我很想知道 SQL Server 是否会针对每个请求生成执行计划。
我是否可以启用任何偏好来为任何查询制定 SQL 缓存执行计划,而不仅仅是存储过程。

【问题讨论】:

  • 就执行计划和缓存而言,创建 SQL 查询的工具根本不重要——EF、NH 或手写。 客户端 - SSMS、您自己的应用程序或 sqcli 也没有。
  • 不,EF 不做任何类型的执行计划缓存。它对执行计划一无所知,这是一个数据库引擎概念,EF 或任何 ORM 对此一无所知。是数据库生成和缓存执行计划
  • 最后,执行计划缓存适用于所有查询,无论它们是否包含在存储过程中。下次发送相同的查询时,SQL Server 将在其执行计划缓存中查找匹配的执行计划并重用它
  • 复杂的查询会导致糟糕的执行计划和糟糕的性能。经常使用复杂的查询,因为数据库模式不适合手头的工作 - 使用 OLTP 数据库进行报告总是会导致问题,仅仅是因为数据库设计不适合报告
  • 通过 ORM 或存储过程执行简单的 SELECT 不会有任何性能差异。如果 LINQ 查询替换了包罗万象的 WHERE 语句,您可能会获得更好的性能。不过,ORM 和 LINQ 不能简化复杂的存储过程,也不能在不先加载对象的情况下直接更新行。这会带来很多麻烦

标签: sql-server entity-framework sql-execution-plan


【解决方案1】:

SQL Server 将它在内存中生成的每个计划(不仅用于过程)缓存起来。这些计划可能不会持续太久。基本上,这取决于您的服务器有多忙、您有多少 RAM、SQL Server 的内存占用情况等。或者,您可以启用查询存储,但它是 SQL Server 2016 中引入的一项新功能。有几个选项,但它可以为您保存特定查询的计划和执行历史等。您可以使用此查询来查看缓存中的实际内容:

SELECT 
     c.usecounts
    ,c.size_in_bytes
    ,c.objtype
    ,query.text
    ,plans.query_plan
FROM sys.dm_exec_cached_plans AS c
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS query
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS plans
ORDER BY c.usecounts DESC

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多