0

最初にビジネスケースについて説明します。質問だけが必要な場合は、数段落先をスキップしてください...

ASP.NET Web API サーバーから .NET モバイル クライアントのデータを Web 経由で同期しています。クライアントの「モバイル性」により、プロセスをできるだけ効率的にしたいので、インクリメンタル同期を実装したいと思います。つまり、クライアントは指定された日付から新しいエントリを要求します。これは通常、最終同期日になります。

エントリの削除は個別に扱っているので、簡単にするために、新しいエントリと変更されたエントリに注目しましょう。

同期中のテーブルが大きすぎて 1 回の応答に収まらないため、ページングが実装されています。

テーブルの各エントリには、一意の IDLastUpdated列があります。サーバーでは、次のコードを使用して、要求されたページで応答しています。

var set             = Model.Set<T>().Where(t => String.Compare(t.LastUpdated, fromDate, StringComparison.Ordinal) >= 0).OrderBy(t => t.Id);
var queryResultPage = set.Skip(pageSize * pageNumber).Take(pageSize);

return queryResultPage.ToList();

Model.Set は、データの取得元の DbSet です。日付を表すために文字列を使用する必要があるという事実を無視してください...

私の質問は、どの SQL Server テーブル インデックスがこの場合に最適なパフォーマンスを生み出すかということです。

4

1 に答える 1

1

Pleunは正確に正しいです。最近、CRM2011プラットフォームでクライアント向けにこのデモを行いました。私は、220万レコードと追加の450万レコードを並べ替えた後、ページビューがページをロードするのに約30秒かかる場合を示しました。

SQLプロファイラーを使用すると、実行中のクエリを見つけることができます。SQL Management Studioに配置します(必要に応じてクリーンアップして標準SQLにします)次に、実行プランを実行し、提案されたインデックス(特に欠落していると表示されているインデックス)を探します。

とにかく、私のクライアントへのデモでは、これを終えた後、クエリは1秒未満に落ちました。そしてページは約4秒でロードされました(それはまだ哀れです)。

于 2013-02-06T23:03:46.010 に答える