2

私は、アプリ全体で使用され、1つを除くすべてのケースで非常にうまく機能する、かなり一般的なLINQクエリを作成しました。現在SQLExpressを実行しているだけなので、ダウンロードが完了するまでSQLプロファイラーにジャンプできません。それまでは、次のLINQで目立つものがあり、大幅な速度低下を引き起こしますか?

以下は、実行される内容の要約です。ホールドアップはもちろんToList呼び出しであり、30秒ほどかかります。私はすべてのグリッドビューにこのコードを使用していますが、1つだけがそれを保持しています。MyGridViewはSQLビューであり、問​​題のデータでは、SQLManagementStudioを介してすべての16417レコードを実行して返すのに2秒しかかかりません。最後に、データの終わり近くのページをリクエストするときはこれだけ時間がかかるので、TakeandSkipの実装にある程度関連していると思います。

private void Demo()
{
    // using LINQ To Entity...
    using (var entities = new MyEntities())
    {
        int page = 1641;
        int pageSize = 10;

        IQueryable<MyGridView> results = entities.MyGridView;

        results = results.Where(r => r.DeletedDate == null);

        var resultCount = results.Count();

        results = ApplyPaging(results, page, pageSize);

        // On the problem data, ToList takes a good 30 seconds to return just 10 records
        var resultList = results.ToList();
    }
}

private IQueryable<T> ApplyPaging<T>(IQueryable<T> data, int currentPage, int pageSize)
{
    if (pageSize > 0 && currentPage > 0)
    {
        data = data.Skip((currentPage - 1) * pageSize);
    }
    data = data.Take(pageSize);
    return data;
}

何か悪い、間違った、危険なものとして飛び出しますか?プロファイラーのコピーをインストールしたら、生成されたSQLを調べて、そこにヒントがあれば投稿します。

4

1 に答える 1

3

http://msdn.microsoft.com/en-us/library/bb357513.aspx#1を​​参照してください

Skipメソッドは、サーバー側の結果のページングなどを整理するためにLINQtoSQLで非常に役立ちます。ただし、LINQは、指定されたLINQ式から難しすぎるSQLクエリを作成する可能性があるため、パフォーマンスの問題が発生する場合があります。私はMSSQLServer 2008でこの問題に触れました。(...)

(...)Orgsテーブルに1000000レコードがある場合、DBサーバーがメモリ内のレコードを並べ替えるため、このクエリは非常に長時間実行されます(すべての列の順序で適切なインデックスがあるとは限りません)。そして、とても単純なクエリでも

orgs.Skip(10).Count()にはかなりの時間がかかりますが、

orgs.Count()-10ははるかに高速に実行されます:)

おそらくそれが問題の根本です。

于 2012-07-11T10:13:09.657 に答える