0

sessionId 行がインデックス付けされている定義済みの (長い) sessionId を含むデータベース テーブルからすべての行を選択する必要があります。しかし、遅いし、アクセスするコードが非常に単純なので、どこに問題があるのだろうと思っています。3 つのレイヤーのコードは次のとおりです。

var localPath = BusinessClient.Instance.Tracker.GetSpecifiedMilestonesInSessionObjects(milestonesInSession.SessionId).ToList();

public IQueryable<MilestonesInSession> GetSpecifiedMilestonesInSessionObjects(long sessionId)
{
    var query = from m in _milestonesInSessionRepository.GetAll()
                where m.SessionId == sessionId
                select m;

    return query;
}

public IQueryable<Model.Tracker.MilestonesInSession> GetAll()
{
    var query = from milestoneSession in _dataContext.Repository<Linq.TrackerMilestonesInSession>()
                select new Model.Tracker.MilestonesInSession
                           {
                               MilestoneId = milestoneSession.MilestoneId,
                               CreatedDate = milestoneSession.CreatedDate,
                               SessionId = milestoneSession.SessionId,
                               ProductId = milestoneSession.ProductId,
                               TrackerId = milestoneSession.TrackerId,
                               StatusId = milestoneSession.StatusId,
                               BankId = milestoneSession.BankId
                           };
    return query;
}

ANTS を使用したパフォーマンスのスクリーンショットを添付します。

プレゼンテーション層 ここに画像の説明を入力

ビジネスレイヤー ここに画像の説明を入力

データ アクセス層 ここに画像の説明を入力

4

3 に答える 3

1

すべての行を返す必要がある場合、インデックスにすべての行が含まれていない限り、インデックスを完全に使用することはほとんどありません (これは適切なアプローチではありません)。

インデックスの使用法は、選択した列にも関連していることに注意してください。ID と名前があり、名前にインデックスがあるテーブルがあり、そこから * を選択すると、インデックスはおそらく使用されません。

[実際の実行計画を含める] オプションを選択して SSMS でクエリを実行し、インデックスが使用されているかどうかを確認します

于 2012-10-19T08:40:12.627 に答える
0

DB の最適化に関する優れた記事を次に示します。一読してください。

http://www.simple-talk.com/sql/sql-training/the-sql-server-query-optimizer/

ボトルネックがコードなのか、実際のクエリなのかを調べる必要があります。 Antzはコード内の呼び出しの結果のみを通知しますが、そのコードは DB などとやり取りする必要があります。

于 2012-10-19T11:42:20.013 に答える
-1

これが実際のクエリであると仮定します

SELECT [t0].[SessionId]
    , [t0].[MilestoneId]
    , [t0].[CreatedDate]
    , [t0].[ProductId]
    , [t0].[TrackerId]
    , [t0].[StatusId]
    , [t0].[BankId] 
FROM [dbo].[TrackerMilestonesInSessions] AS [t0] WHERE [t0].[SessionId] = @p0 

インデックス化された sessionId を引き出すだけでなく、インデックス化されていない列 (milestone、createddate、productid、trackerId、statusid、bankid) も引き出しています。実際のテーブルが非常に大きいため、行のルックアップが実際のパフォーマンスの問題になるようです。

この場合の提案:

  • 通常のデータベース ハウスキーピング タスクの実行: インデックスの再構築、統計の更新
  • テーブルのパーティショニングがオプションになる可能性があります
  • 最後に推奨されない解決策として、これらすべてのフィールドをインデックスに追加できます。これにより、選択が高速化されますが、挿入が遅くなり、インデックスが肥大化します。

アプリケーションのアーキテクチャと目的について詳しく知らなくても、お勧めできるのはこれだけです。

于 2012-10-19T15:39:48.277 に答える