2016-07-03 17 views
1

SQL Serverデータベースに対して非常に遅い(2レコードで30秒)非常に基本的なEntity Frameworkクエリがあります。私は、データベース上で実行取得実際のクエリを得るために私達のDBAと協力:Entity Framework 6.1.3 exec sp_executesql大きなパフォーマンスの問題が発生しました

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秒かかります。

私は幹部sp_executesqlをを取り出し、インラインで変数を交換するときただし、クエリはわずか数ミリ秒かかる値:これら2つのクエリは、このような劇的に異なるパフォーマンスを持っているでしょうなぜ

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コードを修正するか、DBを修正してコードのパフォーマンスを向上させるにはどうすればよいですか?

ありがとうございます!

+1

これらの変数はどこにありますか?遅延読み込みを有効にしたEFのプロキシタイプのエンティティから取得しないようにしてください(必要なプロパティがまだロードされていない場合)。これは、DBからそれぞれの必要なプロパティを受け取るための別個のSQLクエリを作成します。それはあなたのためのケースではない場合は、私はそれらの問題を引き起こす可能性があるか分からない。 –

+0

IvはEFのプロキシタイプのエンティティが意味することを理解していません。変数は、安価なWeb APIアプリケーションからのクエリ文字列から来ています。 – jkruer01

+2

これを確認してください:http://stackoverflow.com/questions/15767803/entity-framework-query-slow-but-same-sql-in-sqlquery-is-fast –

答えて

1

正しい解決策はここにあるようなので、になります。それはそれがあなたを助けている場合(などはnvarchar対NULL可能タイプまたはvarcharなど)に一致するタイプ

といくつかの問題が喜んでいるでしょうだEntity Framework query slow, but same SQL in SqlQuery is fast

たぶん問題を解く。 ;)

関連する問題