对于SQL Server数据库,我有一个非常基本的实体框架查询,它非常慢(2条记录为30秒)。我与DBA合作,以便在数据库上执行实际查询:
exec sp_executesql N'SELECT
[Project1].[DocumentID] AS [DocumentID],
[Project1].[CreationDate] AS [CreationDate],
[Project1].[DocType] AS [DocType]
FROM ( SELECT
[Extent1].[DocumentID] AS [DocumentID],
[Extent1].[DocType] AS [DocType],
[Extent1].[CreationDate] AS [CreationDate]
FROM [dbo].[DocFile] AS [Extent1]
LEFT OUTER JOIN [dbo].[Demographics] AS [Extent2] ON [Extent1].[DemographicsKey] = [Extent2].[DemographicsKey]
LEFT OUTER JOIN [dbo].[Client] AS [Extent3] ON [Extent1].[ClientKey] = [Extent3].[ClientKey]
WHERE (([Extent1].[DocType] = @p__linq__0) OR (([Extent1].[DocType] IS NULL) AND (@p__linq__0 IS NULL))) AND ([Extent1].[CreationDate] >= @p__linq__1) AND (([Extent2].[SSN] = @p__linq__2) OR (([Extent2].[SSN] IS NULL) AND (@p__linq__2 IS NULL))) AND (([Extent3].[ControlNumber] = @p__linq__3) OR (([Extent3].[ControlNumber] IS NULL) AND (@p__linq__3 IS NULL)))
) AS [Project1]
ORDER BY [Project1].[CreationDate] DESC',N'@p__linq__0 nvarchar(4000),@p__linq__1 datetime2(7),@p__linq__2 nvarchar(4000),@p__linq__3 nvarchar(4000)',@p__linq__0=N'AST',@p__linq__1='2013-07-01 15:52:25.4288579',@p__linq__2=N'818760001',@p__linq__3=N'8187600002'
当我从SQL Server Management Studio运行这个确切的查询时,它也需要大约30秒。
但是,当我取出exec sp_executesql并用内联值替换变量时,查询只需几毫秒:
SELECT
[Project1].[DocumentID] AS [DocumentID],
[Project1].[CreationDate] AS [CreationDate],
[Project1].[DocType] AS [DocType]
FROM ( SELECT
[Extent1].[DocumentID] AS [DocumentID],
[Extent1].[DocType] AS [DocType],
[Extent1].[CreationDate] AS [CreationDate]
FROM [dbo].[DocFile] AS [Extent1]
LEFT OUTER JOIN [dbo].[Demographics] AS [Extent2] ON [Extent1].[DemographicsKey] = [Extent2].[DemographicsKey]
LEFT OUTER JOIN [dbo].[Client] AS [Extent3] ON [Extent1].[ClientKey] = [Extent3].[ClientKey]
WHERE (([Extent1].[DocType] = 'AST') OR (([Extent1].[DocType] IS NULL) AND ('AST' IS NULL))) AND ([Extent1].[CreationDate] >= '7/1/2013') AND (([Extent2].[SSN] = '818760002') OR (([Extent2].[SSN] IS NULL) AND ('818760002' IS NULL))) AND (([Extent3].[ControlNumber] = '8187600002') OR (([Extent3].[ControlNumber] IS NULL) AND ('8187600002' IS NULL)))
) AS [Project1]
为什么这两个查询的性能会有如此显着的差异?如何修复EF代码或修复数据库以使代码执行速度更快?
谢谢!
答案 0 :(得分:1)
所以看起来正确的解决方案在这里:Entity Framework query slow, but same SQL in SqlQuery is fast
很可能是类型匹配的问题(如可空类型或varchar与nvarchar等)。
如果它可以帮助您解决问题,那将很高兴。 ;)