1

プロパティとコレクションで構成される複雑なオブジェクトを取得するためにエンティティ フレームワークを使用しています (これらのコレクションはコレクションで構成されることもあります)。データ自体はかなり小さいですが、構造は非常に複雑です。簡単な例 (実際にはさらに多くのプロパティとコレクションがあります):

public class Parent
{
    public int ParentId {get; set;}
    public ICollection<Measurement1> MeasurementOnes {get; set;}
    public ICollection<Measurement2> MeasurementTwos {get; set;}
    public ICollection<Child> Children {get; set;}
    public string PropertyOne {get; set;}
    public string PropertyTwo {get; set;}...etc
}

public class Child
{
    public int ChildrenId {get; set;}
    public ICollection<Measurement3> MeasurementThrees {get; set;}
    public string PropertyThree {get; set;}
}

上記の例は非常に単純化されていますが、構造の概要を示しています。すべての測定値は (外部 API によって) 毎分更新され、プロパティも変更される可能性があります。

この構造をデータベース (SQL Server を使用しています) から読み込み、最適化アルゴリズムに渡す必要があります。これは、すべての親に対して 30 分ごとに行う必要があります。データベースから構造をロードするのに約 1 秒かかります。つまり、特定の時間間隔で約 1800 の親しか最適化できません。

もちろん、クエリを最適化し、データベースにいくつかのインデックスなどを配置し、データベースからの取得時間を 1 秒から 0.7 秒に短縮することもできます。次に、最大で約 2500 の親を最適化できますが、要件は 10000 です (db アクセス時間は 0.18 秒未満である必要があります)。エンティティ フレームワークを使用する代わりにストアド プロシージャを記述した場合にパフォーマンスがどの程度向上するかはわかりませんが、すべてのデータを取得するにはデータベースへの複数のラウンドトリップが必要であるため、オブジェクト構造が本当の問題のようです。

親のデータは間隔ごとにかなり変更されるため、キャッシングが適切かどうかはわかりません。

データベースへのアクセス時間を 10 分の 1 に短縮するためにどのようにすればよいかについて、同様の問題の経験や提案はありますか?

4

2 に答える 2

3

インデックスを作成します。

1秒を0.7に減らすことができるというあなたの仮定は非常に単純です。インデックスを使用すると、クエリ時間を分/秒からミリ秒に短縮できます。数行のデータを読み取るには数ミリ秒かかります。この特定のプロセスがデータの検索に使用するすべての主キー、外部キー、およびその他の列にインデックスを付けます。このプロセスは常に実行されているため、EF が生成および実行する各クエリを最適化することは理にかなっています。ここでは SQL プロファイラーが非常に役立ちます。EF から送信される各クエリをキャプチャし、SSMS でクエリ プランを確認できます。

開始するための SQL プロファイラーへのリンクは次のとおりです。

(他にも利用可能なプロファイリング ツールがありますが、既に SQL プロファイラーを持っているはずです)

于 2013-06-20T09:40:42.180 に答える
3

私が試す2つのこと:

  • 親、子などの複数の結果セットを返すストアド プロシージャを作成します。結果を読み取り、オブジェクトをインスタンス化するコードを作成します。

  • ストアド プロシージャで 'for xml' を使用して、xml の db 側でこの構造を作成する xml デシリアライザーを使用してオブジェクトをインスタンス化する

于 2013-06-20T07:31:47.833 に答える