linq vs sql(或.NET app vs SQL Server管理工作室)

Sta*_*ams 4 .net sql sql-server linq-to-sql

我有一个linq查询,它根据id列(其中id = @id)从View中检索行

此查询需要4秒才能运行.我已经使用SQL Server Profiler来检查由linq执行的查询,如果我将该查询直接复制到管理工作室并执行,则查询只需要56ms.

在我的应用程序中,所有linq查询与视图的指数时间增加是一致的.当相同的查询执行<100ms时,在我的(WPF)应用程序中可能导致延长执行时间的原因是什么?

==编辑==

我已经设法进一步隔离,评论显示剖析器持续时间;

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

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

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

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

/* 250ms, 173 reads */
SELECT * FROM SkuView WHERE TermId == 35
Run Code Online (Sandbox Code Playgroud)

所以问题与使用时通过linq读取计数有关!p.IsDeleted ...

Rem*_*anu 7

可能的罪魁祸首是:

  • 争.从Linq运行时,其他应用程序活动是锁定行,导致查询停止等待锁定.从SSMS运行时,没有其他活动,因此查询快速完成.
  • 参数类型的差异.传递NVARCHAR参数以与VARCHAR列进行比较会导致完全扫描(由于数据类型优先级规则,无法使用索引).这是由错误的LINQ ColumnAttribute引起的.从SSMS运行时,通常会复制查询,并将参数类型更改为VARCHAR.
  • 冷运行与温暖运行.查询首先由LINq运行,这会使缓存变暖(将数据从磁盘提取到内存).从SSMS再次运行时,无需等待IO.

在任何情况下,调查工具都可供您使用.

  • 比较两个查询的读取次数(RPC:Complete,TSQL: Profiler中的BatchComplete事件)
  • 比较计划.使用Showplan XML事件.
  • 看看LINq查询在做什么:sys.dm_exec_requestswait_type,wait_time和wait_resource列
  • 比较两种情况的查询统计数据:sys.dm_exec_query_stats.要查找的内容是logical_reads和physical_reads中两种情况之间的巨大差异,表明计划完全不同(扫描与搜索),或者elapsed_time的差异,但类似的worker_time(表示阻塞,可能是锁定).