3

私はLINQを初めて使用し、知識がほとんどありません。次の複雑なクエリがあります。LINQ に変換したストアド プロシージャよりも 3 倍または 4 倍遅く実行されます。

より速く実行するためのヒントはありますか?

var result = from a in db.A 
    join al in db.AL.Where(q => q.CurrentLocation == 1) on a.AID equals al.AID into tmp_al
    from al in tmp_al.DefaultIfEmpty()
    join l in db.Lon al.LID equals l.LID into tmp_l
    from l in tmp_l.DefaultIfEmpty()
    join r in db.R on l.RID equals r.RID into tmp_r
    from r in tmp_r.DefaultIfEmpty()
    join b in db.B on r.BID equals b.BID into tmp_b
    from b in tmp_b.DefaultIfEmpty()
    join ap in db.AP.Where(q => q.CurrentProtocol == 1) on a.AID equals ap.AID into tmp_ap
    from ap in tmp_ap.DefaultIfEmpty()
    join p in db.P on ap.PID equals p.PID into tmp_p
    from p in tmp_p.DefaultIfEmpty()
    join s in db.S on a.SID equals s.SID into tmp_s
    from s in tmp_s.DefaultIfEmpty()
    join ans in db.AS on a.ASID equals ans.ASID into tmp_ans
    from ans in tmp_ans.DefaultIfEmpty()
    join pr in db.P on p.PI equals pr.PID into tmp_pr
    from pr in tmp_pr.DefaultIfEmpty()
    where a.Active == 1
    group a by new { a.Active, pr.LN, pr.FN, b.BN, r.RID, r.R1, p.PN, s.S1, ans.AS1 }
      into grp
      orderby grp.Key.BN, grp.Key.R1, grp.Key.PN, grp.Key.S1, grp.Key.AS1
      select new
      {
          PIName = grp.Key.LN + " " + grp.Key.FN,
          BN = grp.Key.BN,
          RID = grp.Key.RID,
          R = grp.Key.R1,
          PN = grp.Key.PN,
          S = grp.Key.S1,
          AS = grp.Key.AS1,
          NumberOA = grp.Count()
      };

回答ありがとうございます。@Albin Sunnanbo: 実行計画を確認する方法がわかりません。私のLINQは正しく実行され、必要な出力が生成されます. ただ遅いです。加速させたいと思います。@usr: 元の sql は次のとおりです: ばかげたテーブル名について申し訳ありません。元のコードは機密です。だから私は完全なテーブル名を投稿していません。

CREATE PROCEDURE [dbo].[report_CBRP] --  
AS
SELECT LN + ' ' + FN As PIN, BN, R.RID, R, PN, 
S, AS, COUNT(*) As NOA 
FROM A 
LEFT JOIN AL 
ON A.AID = AL.AID 
AND AL.CL = 1
LEFT JOIN L 
ON AL.LID = L.LID 
LEFT JOIN R
ON L.RID = R.RID 
LEFT JOIN B 
ON R.BID = B.BID 
LEFT JOIN AP
ON A.AID = AP.AID 
AND AP.CPl = 1
LEFT JOIN P 
ON AP.PID = P.PID 
LEFT JOIN S 
ON A.SID = S.SID 
LEFT JOIN AS
ON A.ASID = AS.ASID
LEFT JOIN P
ON P.PI = P.PID 
GROUP BY A.A, LN , FN , B.BN, R.RID, R.R, P.PN, 
S.S, AS.AS 
HAVING A.A = 1 
ORDER BY B.BN, R.R, P.PN, S, AS
GO
4

1 に答える 1

0

ここで SQL ハードライフを行っているようです。

  1. 一般に、あまり多くの結合を避けるようにしてください。むしろ、いくつかの小さなクエリに分割してください。
  2. それ以上に、非常に多くの列があることは言うまでもなく、それ自体が高価な操作であるグループを実行しています
  3. 各テーブルのすべての列を結合していることに気付きました。関連する列のみを選択するようにしてください。
  4. また、 alaplなどのグループで使用されていないテーブルがほとんどないことにも気付きました。それらはまったく必要ですか??
  5. EF からの読み取り専用データには AsNoTracking() を使用します。そのようにして、物事をスピードアップします。
  6. SQL ビューを使用する
于 2015-02-03T12:57:56.090 に答える