7

主要问题 有一些已知的限制,天翻地覆,配置问题,任何东西,这可以解释的事实,所有的事情都是平等的,从C#LINQ查询运行可以采取订单比以任何其他方式运行时间要长吗?LINQ查询非常缓慢相比,SSMS

这里是linq中的缩写查询。它是视图和表格之间非常直接的连接。

var query = (
    from content in context.ApprovedContentView 
       where content.BucketId == 13098 && content.ContentTypeId == 5220 
    join item in context.ActiveContent 
       on content.ContentId equals item.ItemId 
     where 
       item.IsSuchAndSuch == true && item.SomeOtherProperty == 5000 
     select new 
     { 
      ItemId = item.ItemId, 
      Title = item.Title, 
      SubTitle = item.SubTitle, 
      DescriptionText = item.DescriptionText, 
      /* about 10 other scalar fields */ 

     }); 

int count = query.Count(); 
var data = query.OrderByDescending(item => item.ItemId).Skip(5).Take(3); 

这里是(略/ formmatted)SQL它产生

SELECT 
[GroupBy1].[A1] AS [C1] 
FROM (SELECT 
    COUNT(1) AS [A1] 
    FROM  [SchemaX].[ApprovedContentView] AS [Extent1] 
    INNER JOIN [SchemaX].[ActiveContent] AS [Extent2] ON [Extent1].[ContentId] = [Extent2].[ItemId] 
    WHERE (13098 = [Extent1].[BucketId]) AND (5220 = [Extent1].[ContentTypeId ]) AND 
    (1 = [Extent2].[IsSuchAndSuch]) AND (5000 = [Extent2].[SomeOtherProperty ]) 
) AS [GroupBy1] 
GO 

SELECT TOP (3) 
[Filter1].[BucketId] AS [BucketId], 
[Filter1].[ItemId] AS [ItemId], 
[Filter1].[Title] AS [Title], 
[Filter1].[SubTitle] AS [SubTitle], 
[Filter1].[DescriptionText] AS [DescriptionText], 
/* other fields */ 
FROM (SELECT 
      [Extent1].[BucketId] AS [BucketId], 
      [Extent2].[ItemId] AS [ItemId], 
      [Extent2].[Title] AS [Title], 
      [Extent2].[SubTitle] AS [SubTitle], 
      [Extent2].[DescriptionText] AS [DescriptionText], 
      /* other fields */ 
      row_number() OVER (ORDER BY [Extent2].[DealId] DESC) AS [row_number] 
    FROM [SchemaX].[ApprovedContentView] AS [Extent1] 
    INNER JOIN [SchemaX].[ActiveContent] AS [Extent2] ON [Extent1].[ContentId] = [Extent2].[ItemId] 
    WHERE (13098 = [Extent1].[BucketId]) AND (5220 = [Extent1].[ContentTypeId ]) AND 
      (1 = [Extent2].[IsSuchAndSuch]) AND (5000 = [Extent2].[SomeOtherProperty ]) 
) AS [Filter1] 
WHERE [Filter1].[row_number] > 5 
ORDER BY [Filter1].[DealId] DESC 

不同的场景 我正在立足于观察查询我的速度测试运行使用SQL事件探查

原位 当这个linq查询在我的c#应用程序中作为其正常操作的一部分执行时,我观察到在sql分析器中,select count需要3秒钟完成c完成,奇怪的是,产生投影的查询只需要200毫秒,并且时间是可重复的,这似乎排除了查询执行计划缓存问题。

IN LINQPAD (与实体框架5,SQL Server 2008 R2中运行),当我执行通过LinqPad的LINQ语句,使用C#应用程序的DLL的数据上下文,计数和投影每完成一个季度下秒(约224ms,每个总运行时间约450ms)。

SSMS中 不管SQL的来源,当我复制SQL配置文件报告其执行并粘贴到一个管理工作室窗口,执行实际的代码,它需要大约224ms。

数据库优化 在SSMS,当我评价,我复制从分析器(无论是从代码或从linqpad)的SQL实际执行计划,我发现SQL是使用所有正确的索引,并报告只有索引寻求 - 没有表扫描,没有摆脱查找。

那么,什么给了?有人见过这样的事吗?

+0

也许你有一个缓存的执行计划,该计划已经过时?可能会解释为什么只有当你从应用中找到它时才会看到它。 – FlyingStreudel 2013-03-11 16:36:42

+0

它返回多少行?这是您的应用程序的第一个查询吗? – ken2k 2013-03-11 16:37:44

回答

5

我会确保您没有为您的应用程序缓存的错误执行计划。我经常在对已经使用的数据库进行模式工作时发生这种情况。有可能您的执行计划已针对您的应用程序执行上下文缓存,由于架构更改而效率低下,而为您的SSMS查询生成的执行计划是最新的并且没有看到这些性能问题。

我会尝试使用DBCC FREEPROCCACHE来强制更新您的执行计划并查看是否可以解决问题。

+0

这看起来已经打破了日志堵塞。谢谢!! – groggyjava 2013-03-11 18:22:56

+0

这对我有效。对我的本地数据库运行一个相同的查询一直在EF中持续44秒。我在profiler中捕获了查询,并在SSMS中运行它,并且在不到1秒的时间内完成。我在两者之间来回切换,在两者中运行相同的查询,并且这些令人满意的运行时间差异是一致的。在运行DBCC FREEPROCCACHE之后,两个查询都在1秒内运行。 – Triynko 2016-07-08 17:39:37

0

ARITHABORT SSMS默认为ON,SqlClient连接默认为OFF。

如果问题显示出来再次添加:

new SqlCommand("SET ARITHABORT ON", connection).ExecuteNonQuery();