从数据库中的索引列检索索引的ID很慢

时间:2012-10-19 08:31:46

标签: c# asp.net .net sql linq

我必须从包含已定义的(长)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的性能截图:

表示层 enter image description here

业务层 enter image description here

数据访问层 enter image description here

3 个答案:

答案 0 :(得分:1)

如果你需要返回所有行,你几乎不会完全使用索引,除非索引包含所有行(这不是一个好的应用程序)

请记住,索引使用情况也与您选择的列有关。如果你有一个带有ID和Name的表,在名称上有一个索引,并从中选择*,则索引可能不会被使用。

在SSMS上运行查询并选择“包含实际执行计划”选项以查看是否正在使用索引

答案 1 :(得分:0)

这是一篇关于数据库优化的好文章,请看一看。

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

您需要了解瓶颈是代码还是实际查询。 Antz 只会告诉您代码中调用的结果,但该代码需要与DB等对话。

答案 2 :(得分:-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,而且还要提取非idexed列(里程碑,createddate,productid,trackerId,statusid,bankid)。看起来实际的表太大,以至于行查找成为实际的性能问题。

本案例的建议:

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

在不了解应用程序架构和清除的情况下,我可以推荐它。