2012-10-19 132 views
0

我必须从包含定义的(长)sessionId的数据库表中选择所有行,其中sessionId行会被索引。但是速度很慢,而且由于访问代码非常简单,我想知道问题出在哪里。这里是三个层的代码:附性能的使用ANTS截图从数据库的索引列中检索索引ID很慢

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; 
} 

这里:

表示层 enter image description here

个业务层 enter image description here

数据访问层 enter image description here

+3

运行SQL Server Profiler,拦截查询,在其上运行解释/查询计划。不知道你的数据库布局,这是无法回答的。 – CodeCaster

+0

这是建立的查询: {SELECT [t0]。[SessionId],[t0]。[MilestoneId],[t0]。[CreatedDate],[t0]。[ProductId],[t0]。[TrackerId], [t0]。[StatusId],[t0]。[BankId] FROM [dbo]。[TrackerMilestonesInSessions] AS [t0] WHERE [t0]。[SessionId] = @ p0 } – Attila

+0

我无法做任何事该查询,我没有你的数据库。 **您必须在SSMS中运行该查询并显示执行计划,这将显示任何瓶颈。 – CodeCaster

回答

1

如果需要返回所有的行,你几乎完全使用索引,除非该指数中的所有行(whihc不是一个好apporach)

请记住,索引使用情况也与您选择的列有关。如果你有一个带有ID和Name的表,并且有一个名字索引,并且选择*,那么索引可能不会被使用。

与选择看“包括实际的执行计划”选项运行在SSMS查询,如果正在使用的索引或不

0

下面是DB优化的好文章,需要通过它看看。

你需要找出瓶颈是否是代码,或实际查询。 小蚁雄兵只会告诉你在代码中调用的结果,但代码需要发言的DB等

-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 

你不仅拉动out索引sessionId,你也拉出非idexed列(milestone,createddate,productid,trackerId,statusid,bankid)。看起来实际的表格非常大,您的行查找成为实际的性能问题。

建议在这种情况下:

  • 运行常用数据库整理任务:索引重建,统计更新
  • Partitionining表可能是一个选项
  • 作为最后不建议解决方案,您可以添加所有这些字段到索引,这将加快选择,但会使插入缓慢,并使您的索引臃肿。

不知道更多关于应用程序架构和purpse这是我所能推荐的。

+0

这是霰弹枪调试:_“我不知道它是什么,所以我只是点击这里”_。有很多工具可以完全告诉你为什么**某个查询很慢。您建议只是猜测并向不在'WHERE'子句中的列添加索引。 – CodeCaster

+0

命名一些......“大量的工具”是一种过于通用的方式,你不觉得吗? – b0rg

+0

不像您的答案一样通用。 _“我的查询很慢”的解决方案不是_“重建索引”_,而是_“找出原因”_。在我对这个问题的评论中,我已经指出了几个步骤。 – CodeCaster