3

ここ数日、linq クエリのパフォーマンスに苦労していました。

LinqConnectionDataContext context = new LinqConnectionDataContext();
System.Data.Linq.DataLoadOptions options = new System.Data.Linq.DataLoadOptions();
options.LoadWith<Question>(x => x.Answers);
options.LoadWith<Question>(x => x.QuestionVotes);
options.LoadWith<Answer>(x => x.AnswerVotes);
context.LoadOptions = options;
var query =( from c in context.Questions
            where c.UidUser == userGuid
            && c.Answers.Any() == true
            select new
            {
                c.Uid,
                c.Content,
                c.UidUser,
                QuestionVote = from qv in c.QuestionVotes where qv.UidQuestion == c.Uid && qv.UidUser == userGuid select new {qv.UidQuestion, qv.UidUser },
                Answer = from d in c.Answers
                         where d.UidQuestion == c.Uid
                         select new
                         {
                             d.Uid,
                             d.UidUser,
                             d.Conetent,
                             AnswerVote = from av in d.AnswerVotes where av.UidAnswer == d.Uid && av.UidUser == userGuid select new { av.UidAnswer, av.UidUser }
                         }
            }).ToList();

クエリは 5000 行を処理する必要があり、最大 1 分かかります。このクエリのパフォーマンスを改善するにはどうすればよいですか?

アップデート:

ここに画像の説明を入力

4

2 に答える 2

1

始めるための何か。

CREATE PROCEDURE GetQuestionsAndAnswers
(
    @UserGuid VARCHAR(100)
)
AS
BEGIN

SELECT 
c.Uid, 
c.Content, 
c.UidUser, 
qv.UidQuestion, 
qv.UidUser, 
av.UidAnswer, 
av.UidUser, 
av.Content,
d.Uid,
d.UidUser,
d.Content
FROM Question c
INNER JOIN QuestionVotes qv ON qv.UidQuestion = c.Uid AND qv.UidUser = @UserGuid
INNER JOIN Answers d ON d.UidQuestion = c.Uid
INNER JOIN AnswerVotes av ON av.UidAnswer = d.Uid AND av.UidUser = @UserGuid
WHERE c.UidUser = @UserGuid

END

デフォルトでは、プライマリ列にクラスター化インデックスが既にあり (データベース側でこれを確認してください)、QuestionVote - UidUser 列、AnswerVote - UidUser 列、Answer - UidQuestion 列に非クラスター化インデックスが必要です。

こちらもご覧ください。遅延実行.AsQueryable()の代わりに使用したい場合がありますToList()

ToList()しますか?

于 2012-10-17T12:21:12.353 に答える
1

sql-debug-visualizerを使用して生成された SQL をチェックアウトし、生成された SQL を コピーして SQL クライアントから実行し、所要時間を確認しました。1 分近くかかる場合は、インデックス作成やストアド プロシージャを追加するか、ビューなどを作成して、DB レベルでパフォーマンスを改善する必要があります。

上記にそれほど時間がかからない場合は、いつでもストアド プロシージャを作成し、LINQ to SQ Lを使用してそれを呼び出すことができます。

もう1つの推奨事項は、将来なので変更できる場合はEntity Frameworkを使用することです。

于 2012-10-17T12:12:18.980 に答える