实体框架生成的SQL运行极慢
最近,我们的asp.net/EF5应用程序连接到SQL server 2012的速度开始放缓。sql server生成的sql如下所示,返回一行需要58秒:实体框架生成的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]
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