实体框架生成的SQL运行极慢

实体框架生成的SQL运行极慢,sql,sql-server,entity-framework,Sql,Sql Server,Entity Framework,最近,我们的asp.net/EF5应用程序连接到SQL server 2012的速度开始放缓。sql server生成的sql如下所示,返回一行需要58秒: exec sp_executesql N'SELECT TOP (50) [Project1].[C1] AS [C1], [Project1].[C2] AS [C2], [Project1].[Id] AS [Id] FROM ( SELECT [Extent1].[Id] AS [Id], [Extent2]

最近,我们的asp.net/EF5应用程序连接到SQL server 2012的速度开始放缓。sql server生成的sql如下所示,返回一行需要58秒:

exec sp_executesql N'SELECT TOP (50) 
[Project1].[C1] AS [C1], 
[Project1].[C2] AS [C2], 
[Project1].[Id] AS [Id]
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent2].[FullName] AS [FullName], 
    1 AS [C1], 
    [Extent2].[FullNameWithAddr] + CASE WHEN ([Extent1].[NPI] IS NOT NULL) THEN N''; NPI#: '' + [Extent1].[NPI] ELSE N'''' END + CASE WHEN ([Extent1].[StateLIC] IS NOT NULL) THEN N''; License#: '' + [Extent1].[StateLIC] ELSE N'''' END AS [C2]
    FROM  [dbo].[Provider] AS [Extent1]
    INNER JOIN [dbo].[Person] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
    WHERE (1 = [Extent2].[Active]) AND (([Extent1].[NPI] LIKE @p__linq__0 ESCAPE ''~'') OR ([Extent1].[StateLIC] LIKE @p__linq__1 ESCAPE ''~''))
)  AS [Project1]
ORDER BY [Project1].[FullName] ASC',N'@p__linq__0 varchar(8000),@p__linq__1 varchar(8000)',@p__linq__0='1043203862%',@p__linq__1='%1043203862%' 
但是,如果删除外部投影查询,则新查询(如下)所用时间不到1秒。请告知我可能采取的任何行动,以诊断和修复数据库上的问题;我无法轻松控制EF发出的查询

exec sp_executesql N' SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent2].[FullName] AS [FullName], 
    1 AS [C1], 
    [Extent2].[FullNameWithAddr] + CASE WHEN ([Extent1].[NPI] IS NOT NULL) THEN N''; NPI#: '' + [Extent1].[NPI] ELSE N'''' END + CASE WHEN ([Extent1].[StateLIC] IS NOT NULL) THEN N''; License#: '' + [Extent1].[StateLIC] ELSE N'''' END AS [C2]
    FROM  [dbo].[Provider] AS [Extent1]
    INNER JOIN [dbo].[Person] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
    WHERE (1 = [Extent2].[Active]) AND (([Extent1].[NPI] LIKE @p__linq__0 ESCAPE ''~'') OR ([Extent1].[StateLIC] LIKE @p__linq__1 ESCAPE ''~''))
',N'@p__linq__0 varchar(8000),@p__linq__1 varchar(8000)',@p__linq__0='1043203862%',@p__linq__1='%1043203862%' 
编辑: 我已经确定是“顶级”运营商导致了减速。如果我执行下面的查询,它仍然很快,即使使用外部投影查询,减去顶部

exec sp_executesql N'SELECT 
[Project1].[C1] AS [C1], 
[Project1].[C2] AS [C2], 
[Project1].[Id] AS [Id]
FROM ( SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent2].[FullName] AS [FullName], 
    1 AS [C1], 
    [Extent2].[FullNameWithAddr] + CASE WHEN ([Extent1].[NPI] IS NOT NULL) THEN N''; NPI#: '' + [Extent1].[NPI] ELSE N'''' END + CASE WHEN ([Extent1].[StateLIC] IS NOT NULL) THEN N''; License#: '' + [Extent1].[StateLIC] ELSE N'''' END AS [C2]
    FROM  [dbo].[Provider] AS [Extent1]
    INNER JOIN [dbo].[Person] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
    WHERE (1 = [Extent2].[Active]) AND (([Extent1].[NPI] LIKE @p__linq__0 ESCAPE ''~'') OR ([Extent1].[StateLIC] LIKE @p__linq__1 ESCAPE ''~''))
)  AS [Project1]
ORDER BY [Project1].[FullName] ASC',N'@p__linq__0 varchar(8000),@p__linq__1 varchar(8000)',@p__linq__0='1043203862%',@p__linq__1='%1043203862%' 
编辑2。 我还确定,如果我为top count创建一个变量,查询(以下)会很快:


尝试在Person.FullName上的
[Person].[FullName]
索引上添加索引:在[dbo].[Person]([Active]ASC)include([ID],[FullNameWithAddr],[FullName])上创建非聚集索引[ix\u Person\u Active\u include\u ID\u FNwAdd\u FN]GOIt不是
全名上的索引
您只是将其包含在
活动的索引中
查看执行计划以找到线索。。并尝试在SQL中使用在所有列上创建索引,并仅在Fullname上创建索引。。在[dbo].[Person]([FullName])上创建非聚集索引[IX_Person\u FullName]无关提示:如果表有聚集索引,则不需要在其他索引上包含([Id])(我假设
Id
是主键)。参考文献
declare @p1 int = 50
Select top (@p1) * from 
(
    SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent2].[FullName] AS [FullName], 
    1 AS [C1], 
    [Extent2].[FullNameWithAddr] + CASE WHEN ([Extent1].[NPI] IS NOT NULL) THEN N'; NPI#: ' + [Extent1].[NPI] ELSE N'' END + CASE WHEN ([Extent1].[StateLIC] IS NOT NULL) THEN N'; License#: ' + [Extent1].[StateLIC] ELSE N'' END AS [C2]
    FROM  [dbo].[Provider] AS [Extent1]
    INNER JOIN [dbo].[Person] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]
    WHERE (1 = [Extent2].[Active]) AND (([Extent1].[NPI] LIKE '1043203862%' ESCAPE '~') OR ([Extent1].[StateLIC] LIKE '%1043203862%' ESCAPE '~'))
) a order by a.fullname