簡體   English   中英

從數據庫中的索引列中檢索索引ID的速度很慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM