2010-12-09 85 views
4

我有一个LINQ查询从基于一个ID列(其中id = @ ID)LINQ VS SQL(或.NET应用程式与SQL Server Management Studio中)

此查询需要4秒视图中检索行跑。我已经使用SQL Server Profiler来检查由linq执行的查询,并且如果我将该查询直接复制到management studio并执行,查询只需要56ms。

这个指数时间增加在我的应用程序中的所有linq查询中都是一致的。当(WPF)应用程序中执行< 100ms时,可能会导致执行时间延长?

== ==编辑

我已经成功地进一步孤立,言论表明探查持续时间;

/* 3953ms, 111487 reads */ 
context.SkuView.Where(p => p.TermId == 35 && !p.IsDeleted).ToList(); 

/* 90ms, 173 reads */ 
context.SkuView.Where(p => p.TermId == 35).ToList(); 

如果我把(sql呈现的)linq查询直接粘贴到我得到的ssms中;

/* 250ms, 173 reads */ 
SELECT * FROM SkuView WHERE TermId == 35 AND IsDeleted = 0 

/* 250ms, 173 reads */ 
SELECT * FROM SkuView WHERE TermId == 35 

所以,问题有事情做与读取使用p.IsDeleted时通过LINQ算...

+0

哇,这是一个巨大的时间差。要清楚,运行4秒是根据SQL事件探查器执行查询所花费的时间? – Pandincus 2010-12-09 01:05:48

+0

正确。 linq使用exec sp_executesql执行查询,Profiler显示4秒的运行时间。如果我复制刚才运行的确切的exec _sp_executesql,并在SSMS中执行它,profiler显示58ms – 2010-12-09 01:12:57

+0

L2S不是查询数据库的最有效的方式,但这是一个非常大的差异。 – Phill 2010-12-09 01:17:19

回答

7

可能的罪魁祸首是:

  • 争。当从Linq运行时,其他应用程序活动正在锁定行并导致查询停止等待锁定。当从SSMS运行时,没有其他活动,因此查询速度快。
  • 参数类型的差异。将NVARCHAR参数传递给VARCHAR列进行比较会导致全面扫描(由于Data Type Precedence规则,索引无法使用)。这是由错误的LINQ ColumnAttribute造成的。当从SSMS运行时,查询通常会不经意地被复制,并且参数类型被更改为VARCHAR。
  • 冷跑与温跑。查询首先由LINq运行,这会加热缓存(将数据从磁盘提取到内存)。当从SSMS再次运行时,不需要等待IO。

在任何情况下,调查工具都在您的处置。

  • 比较的数量从两个查询(RPC:Complete,在探查TSQL:BatchComplete事件)
  • 比较计划读取。使用Showplan XML事件。
  • 看看什么是LINQ查询sys.dm_exec_requests wait_type,WAIT_TIME和wait_resource列
  • 比较了两种情况下的查询统计:sys.dm_exec_query_stats。在logical_reads和physical_reads这两种情况之间寻找的东西差异巨大,表明了非常不同的计划(扫描vs.搜索),或者elapsed_time和worker_time(可能表示阻塞,锁定的可能性)之间的差异。
0

这个查询需要4秒,运行...如果我直接复制查询管理工作室和执行,查询只需要56MS。

您的应用程序和管理工作室之间没有什么神奇的区别。这两个程序都创建了一个到数据库的连接,并发出sql文本命令(一旦在数据库服务器中:生成查询计划,IO和CPU被使用并且结果被传回)。由于这里唯一的区别是“应用程序建立连接”,所以您应该检查连接。从连接字符串开始...

假设连接字符串中没有问题,请转到SET settings。特别是SET ANSI_NULLS应该打开,因为它可能会干扰具有聚簇索引的计算列和视图。

2

更新数据库的统计数据解决了这个问题。

exec sp_updatestats 

大部分由于Remus用于学习;)

0

ARITHABORT是ON通过SSMS和OFF缺省默认为一个SqlClient连接。

这解决了类似的问题,对我来说:

new SqlCommand("SET ARITHABORT ON", connection).ExecuteNonQuery(); 
相关问题