2012-03-13 12 views
0

以下のC#コードは3秒で実行されます。私はSQLプロファイラの出力も列挙しました。動的SQLを使用しないようにステートメントを変更すると、ミリ秒で実行されます。私はこの問題を解決するための良いリソースは見つけられません。しかし、パーサーがパラメータの値を知らないため、動的SQLではクエリプランを最適化できないことを説明する記事を見つけることができました。このlinqクエリのパフォーマンスの問題を修正するにはどうすればよいですか?

public string GetIncorporation(Parcel parcel) 
    { 

    var result = (from c in _context.Districts 
        where c.PARCEL_ID == parcel.PARCEL_ID && c.DB_YEAR == parcel.DB_YEAR && c.DISTRICT_CD.CompareTo("9000") < 0 
        select c).ToList(); 

exec sp_executesql N'SELECT 
[GroupBy1].[A1] AS [C1] 
FROM (SELECT 
    MAX([Filter1].[A1]) AS [A1] 
    FROM (SELECT 
     SUBSTRING([Extent1].[DISTRICT_CD], 0 + 1, 2) + N''00'' AS [A1] 
     FROM [STAGE].[DISTRICT] AS [Extent1] 
     WHERE ([Extent1].[PARCEL_ID] = @p__linq__0) AND ([Extent1].[DB_YEAR] = @p__linq__1) AND ([Extent1].[DISTRICT_CD] < N''9000'') 
    ) AS [Filter1] 
) AS [GroupBy1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 int',@p__linq__0=N'0001-02-0003',@p__linq__1=2012 

私は、サービス層を構築しようとしています。私はストアドプロシージャとLinqクエリの混在したバッチを持つことを望まない

答えて

4

SSMSにそのクエリを貼り付け、実行計画を実行し、欠落しているインデックスがあるかどうかを確認しましたか?また

、あなたが選択を使用して、それらを制限し、テーブルからすべての列を必要としない場合:

var result = (from c in _context.Districts 
        where c.PARCEL_ID == parcel.PARCEL_ID && c.DB_YEAR == parcel.DB_YEAR && c.DISTRICT_CD.CompareTo("9000") < 0 
        select c.Parcel_ID).ToList(); 

または

var result = (from c in _context.Districts 
        where c.PARCEL_ID == parcel.PARCEL_ID && c.DB_YEAR == parcel.DB_YEAR && c.DISTRICT_CD.CompareTo("9000") < 0 
        select new { c.Parcel_ID, c.column2, c.column3}).ToList(); 
+0

はい、私はそれをしました。それは私がPARCEL_ID、DISTRICT_CDを含むDB_YEAR上のインデックスを作成することを示唆しています –

+0

事は...既にインデックスPARCEL_ID、DB_YEAR、DISTRICT_CDを持っています。これは動的クエリのt-SQLバージョンで使用されます。 –

0

LINQは罰金に見える、あなたが持っています正しいインデックス?

貼り付けたSSMSのクエリでは、DISTRICT_CDの制限がないため、実際に実行されているクエリであることを確認してください。

0

パフォーマンスの問題は 'CompareTo'部分にあります。この関数を通常のSQLに変換することはできないため、Entityフレームワークは最初の2つの条件(純粋なSQLで取得)に一致するすべてのオブジェクトをマテリアライズします。この後(あなたが見ることができるようにしばらく時間がかかります)、3番目の条件はメモリ内で一致します。 linqクエリでCompareToメソッドを避ければ、問題はなくなります。

+0

あなたは間違っています。しかし、あなたは私の質問で間違いを指摘しました。私は間違ったSQLを貼り付けた。不思議なことに、linqエンジンはCompareTo()をSQL文に変換するのに最適な仕事をします。 –

+0

私はそれが素晴らしいと思います!そのlinqはそのような変換を行うことができます!私はそれがあなたが提案したようにうまくいくと思った。 –

関連する問題