[英]How to precompile sql queries in EF Code-First?
我正在使用ASP.Net4.5.1和EF6.0 Code-First方法。
我意识到查询需要花费大量时间来执行。 我使用EF Profiler检查查询并微调查询。
我用谷歌搜索并开始编译Linq。
这些是我得到的链接。
但是没有一个能解决我的问题。
假设我有以下查询。
public IEnumerable<Student> GetStudents()
{
using(DbContext db = new DbContext()
{
IQueryable<Student> query = (from c in db.Students
where c.Hobby== "Hockey"
select c);
IEnumerable<Student> students= query.toList<Student>();
return students;
}
}
现在我如何缓存查询计划或编译此Linq以提高性能?
还有一件事要问,EF比原生SQL慢吗?
我更喜欢使用EF / ORM,这是正确的选择吗?
是的,EF比SQL慢。 任何 ORM都是如此。 ORM必须能够将基于代码的“查询”转换为真正的SQL查询,然后必须使用结果来实例化对象图。 但是,这些通常是您想要 ORM的东西。 手动执行此类操作会更加困难且更容易出错。
您是否使用ORM完全取决于您的应用程序的需求。 通常,是的,建议使用ORM,但如果您需要极高的性能,则可能需要使用纯SQL。 ORM在个人表现方面也有很大差异。 已知EF是特别慢的ORM。 它是最容易使用和使用的产品之一,但如果性能是一个问题,那么你最好使用像Dapper这样的东西。 您还可以混合使用ORM和SQL。 将EF用于标准CRUD然后利用存储过程进行复杂查询完全没有异常。
总而言之,您拥有的查询非常基础。 如果您遇到类似这样的性能问题,要么您的SQL Server实例没有足够的资源来使用,您的网络速度非常慢,或者该表中有大量数据并且您没有正确使用索引。
在最后一点上,文本搜索通常是使用SQL执行速度最慢的文本搜索。 如果您打算查询特定的基于文本的列,例如Hobby
,那么您应该在其上添加索引。 您可以在数据库中手动执行此操作,也可以在属性上使用[Index]
数据注释。 请记住,只能对基于文本的固定长度列进行索引。 默认情况下,EF将生成字符串属性为NVARCHAR(MAX)
。 如果要对列使用索引,则需要将[Index]
与[MaxLength(N)]
。
如果您想要更快的数据访问代码,您应该考虑使用Pure ADO.NET代码,该代码使用SqlCommand
和SqlDataReader
的ExecuteReader
方法执行SQL查询。 但是现在你需要编写一些额外的代码来创建一个SqlCommand
,传递查询和参数并从SqlDataReader
读取行。
你应该考虑像Dapper这样的迷你ORM。 它比EF快。 如上所述,您不需要编写太多代码。 Dapper将执行您的查询并将结果集映射到您的DTO。
使用Dapper的快速示例。
var con= new SqlConnection("YourConnectionStringGoesHere");
var posts = con.Query<Post>("SELECT ID,Name from Post");
Dapper支持从多个表(JOIN)读取数据并映射到具有Navigation属性的对象。
EF / NHibernate将帮助您进行快速开发,因为它很容易通过API /方法与数据库通信。 但是你要为表现买单。
另外要记住的重要一点是优化您的SQL查询。 即使使用纯ADO.NET,如果未优化sql查询,也会导致性能下降。 为表/列添加适当的索引也可能有所帮助。
我不完全确定您的应用程序,但您应该阅读有关缓存数据的信息,以便您的数据库不会一直被打中。 这通常会提高您的表现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.