【发布时间】: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