[英]The field is not indexed, cannot query on fields that are not indexed at Raven.Database.Indexing
[英]Retrieving indexed Ids from an indexed column in database is slow
我必須從包含已定義(long)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進行表演的屏幕截圖:
表示層
業務層
資料存取層
如果需要返回所有行,除非索引具有所有行,否則幾乎不會使用索引(這不是很好的方法)
請記住,索引的使用也與您選擇的列相關。 如果您有一個具有ID和Name的表,並且在name上有一個索引,並從中選擇*,則可能不會使用該索引。
在SSMS上運行查詢,並選擇“包括實際執行計划”選項,以查看是否正在使用索引
這是一篇有關數據庫優化的好文章,請仔細閱讀。
http://www.simple-talk.com/sql/sql-training/the-sql-server-query-optimizer/
您需要找出瓶頸是代碼還是實際查詢。 Antz只會在代碼中告訴您調用的結果,但是該代碼需要與數據庫對話。
假設這是實際查詢
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)。 看起來實際表太大了,以致您的行查找成為實際的性能問題。
在這種情況下的建議:
我不建議您進一步了解應用程序體系結構和用途。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.