基于我所看到的答案是否定的,但总有可能
答案 0 :(得分:1)
存储过程在执行时编译,然后执行计划存储在SQL Server维护的执行计划缓存中。除非对基础表进行一些重要更改(例如更新的统计信息,新索引,重新编译的手动请求等),否则它将使用存储的执行计划。
Linq-to-SQL ad-hoc查询使用sp_executesql存储过程。结果是它们也存储在SQL Server的执行计划缓存中,因此多次运行相同的查询*只会导致SQL Server编译一次,然后使用缓存的计划。 (* =与相同数量和相同类型的参数相同的查询)
也就是说,在将linq表达式树转换为SQL查询时,Linq-to-SQL也做了一些工作。这种情况的开销各不相同,但对于经常执行的非常复杂的查询,这可能是显而易见的。
为了降低重复将同一查询转换为SQL的成本,Linq-to-SQL有一个名为CompiledQuery的东西。不幸的是,CompiledQuery类每个查询最多只支持四个参数,因此对于复杂的查询[它会比非常简单的查询产生更大的影响],由于这个限制,它通常被排除为选项。值得注意的是CompiledQuery SQL查询没有利用L2S客户端谓词消除,因此如果您使用CompiledQuery类,则值得比较SQL服务器端成本(尤其是I / O方面)有任何where子句谓词可能被客户端消除......