我必须从包含已定义的(长)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的性能截图:
表示层
业务层
数据访问层
答案 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)。看起来实际的表太大,以至于行查找成为实际的性能问题。
本案例的建议:
在不了解应用程序架构和清除的情况下,我可以推荐它。