0

我必须从包含已定义(长)sessionId 的数据库表中选择所有行,其中 sessionId 行被索引。但它很慢,而且由于访问它的代码非常简单,我想知道问题出在哪里。下面是三层的代码:

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

这里有一篇关于数据库优化的好文章,看一下。

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

您需要找出瓶颈是代码还是实际查询。 Antz只会在代码中告诉您调用的结果,但该代码需要与数据库等对话。

于 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,还要提取非索引列(里程碑、createddate、productid、trackerId、statusid、bankid)。看起来实际的表是如此之大,以至于您的行查找成为一个实际的性能问题。

在这种情况下的建议:

  • 运行通常的数据库管理任务:索引重建、统计信息更新
  • 对表进行分区可能是一种选择
  • 作为最后一个不推荐的解决方案,您可以将所有这些字段添加到索引中,这将加快选择速度,但会使插入速度变慢,并使索引膨胀。

在不了解应用程序架构和目的的情况下,我只能推荐它。

于 2012-10-19T15:39:48.277 回答