2016-05-13 9 views
1

ビューからの呼び出し(TheSQLView) - テーブルTheSQLTableに参加して、そのビューからの結果のリストを取得するクエリがあります。すべてのレコードをビューから取得すると、2000件の結果が出ます。それだけで約40秒かかる。 40件の結果を返すwhere節を使用しても、約8秒かかります。ここでLINQクエリのパフォーマンスを向上させる方法

はいくつかのコードです:

using (var db = new SQLEntities(_connStr)) 
{ 
    var query = from x in db.TheSQLView 
       join y in db.TheSQLTable on x.ID equals y.ID 
       select new BSTProject() 
       { 
        ID = x.ID, 
        Name = x.Name, 
        ... snipped for brevity (about 12 more properties) ... 
        // The two joined properties 
        PctCompleted = y.PctCompleted == null ? 0 : y.PctCompleted, 
        IsCompleted = y.IsCompleted 
       }; 

    return query.toList(); 
} 

私はテーブルの上にビューを結ぶに何かあるかもしれないと仮定していますか?

編集1:は、SQLプロファイラを実行し、このクエリが実行されているものです:

SELECT 
[Project1].[IsCompleted] AS [IsCompleted], 
[Project1].[ID] AS [ID], 
[Project1].[Name] AS [Name], 
[Project1].[org_code] AS [org_code], 
[Project1].[GroupName] AS [GroupName], 
[Project1].[clnt_name] AS [clnt_name], 
[Project1].[start_date] AS [start_date], 
[Project1].[PRIcode] AS [PRIcode], 
[Project1].[PRI] AS [PRI], 
[Project1].[PMcode] AS [PMcode], 
[Project1].[PM] AS [PM], 
[Project1].[DPMcode] AS [DPMcode], 
[Project1].[DPM] AS [DPM], 
[Project1].[ADMcode] AS [ADMcode], 
[Project1].[ADM] AS [ADM], 
[Project1].[PhaseBudgetsTotal] AS [PhaseBudgetsTotal], 
[Project1].[PhasesEffortTotal] AS [PhasesEffortTotal], 
[Project1].[PhasesBudgetRemaining] AS [PhasesBudgetRemaining], 
[Project1].[PhasesOver] AS [PhasesOver], 
[Project1].[C1] AS [C1] 
FROM (SELECT 
    [Extent1].[org_code] AS [org_code], 
    [Extent1].[GroupName] AS [GroupName], 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[clnt_name] AS [clnt_name], 
    [Extent1].[start_date] AS [start_date], 
    [Extent1].[PRIcode] AS [PRIcode], 
    [Extent1].[PRI] AS [PRI], 
    [Extent1].[PMcode] AS [PMcode], 
    [Extent1].[PM] AS [PM], 
    [Extent1].[DPMcode] AS [DPMcode], 
    [Extent1].[DPM] AS [DPM], 
    [Extent1].[ADMcode] AS [ADMcode], 
    [Extent1].[ADM] AS [ADM], 
    [Extent1].[PhaseBudgetsTotal] AS [PhaseBudgetsTotal], 
    [Extent1].[PhasesEffortTotal] AS [PhasesEffortTotal], 
    [Extent1].[PhasesBudgetRemaining] AS [PhasesBudgetRemaining], 
    [Extent1].[PhasesOver] AS [PhasesOver], 
    [Extent2].[IsCompleted] AS [IsCompleted], 
    CASE WHEN ([Extent2].[PctCompleted] IS NULL) THEN cast(0 as decimal(18)) ELSE [Extent2].[PctCompleted] END AS [C1] 
    FROM (SELECT 
[TheSQLView].[org_code] AS [org_code], 
[TheSQLView].[GroupName] AS [GroupName], 
[TheSQLView].[ID] AS [ID], 
[TheSQLView].[Name] AS [Name], 
[TheSQLView].[clnt_name] AS [clnt_name], 
[TheSQLView].[start_date] AS [start_date], 
[TheSQLView].[PRIcode] AS [PRIcode], 
[TheSQLView].[PRI] AS [PRI], 
[TheSQLView].[PMcode] AS [PMcode], 
[TheSQLView].[PM] AS [PM], 
[TheSQLView].[DPMcode] AS [DPMcode], 
[TheSQLView].[DPM] AS [DPM], 
[TheSQLView].[ADMcode] AS [ADMcode], 
[TheSQLView].[ADM] AS [ADM], 
[TheSQLView].[PhaseBudgetsTotal] AS [PhaseBudgetsTotal], 
[TheSQLView].[PhasesEffortTotal] AS [PhasesEffortTotal], 
[TheSQLView].[PhasesBudgetRemaining] AS [PhasesBudgetRemaining], 
[TheSQLView].[PhasesOver] AS [PhasesOver] 
FROM [dbo].[TheSQLView] AS [TheSQLView]) AS [Extent1] 
    INNER JOIN (SELECT 
[TheSQLTable].[ID] AS [ID], 
[TheSQLTable].[IsCompleted] AS [IsCompleted], 
[TheSQLTable].[PctCompleted] AS [PctCompleted] 
FROM [dbo].[TheSQLTable] AS [TheSQLTable]) AS [Extent2] ON [Extent1].[ID] = [Extent2].[ID] 
) AS [Project1] 
ORDER BY [Project1].[ID] ASC 
+1

実際に実行されたクエリを確認するには、SQL Server Profilerを参照してください。 – SSJGSS

+0

SQLプロファイラを取得し、正確なSQLがどのように実行されるかを確認してください。それを実行して、実行計画を見てください。遅さの理由は無限です - 私は多くを助けることができなくなるのではないかと心配しています。 – trailmax

+3

ビューが問題のようです。したがって、ここのLINQの部分は無関係です。ビューのSQLクエリを表示し、dbスキーマについて詳しく教えてください。 –

答えて

0

あなたの質問内の貴重な少しの情報があります。生成されたSQLは素晴らしいですが、SQLプロファイラからCPU +論理読み取りカウンタも投稿していればさらに良いでしょう。

しかし、私は答えで野生の刺し傷を取るでしょう:インデックス付きのビュー(それ以下のクラスター化されたインデックス)を見てください。私はあなたの意見にはそれがないと強く疑う。 https://stackoverflow.com/a/3986540/1736944

注意:エンタープライズエディションのSQL Serverを使用していない場合は、クエリに「WITH(NOEXPAND)」ヒントが含まれている必要があります。最初のビューからすべての行を選択し、EFクエリでこの2番目のビューを参照する2番目のビューを作成するだけです。 SQL Profiler +クエリプランで合理的なクエリプランを取得することを確認します。

関連する問題