我目前正在優化我們的Web應用程序,我不確定如何從這裏開始:有一個大的SQL數據庫,其中包含一個包含數百萬個條目的大型歸檔表。這些行需要儘可能快地顯示在我們的可視化中(通過一個或兩個字段和一個時間戳過濾並通過Ajax傳遞到客戶機中的JS部分)。我在數據庫中創建了有用的索引,並且我也消除了通過我的歸檔實體中的導航屬性進行交叉引用的需要,這樣我就可以從一個表中只讀取數據,並在前端執行其他操作,從而大大提高了性能。我發現一個問題:我沒有要求所有的匹配前端數據(沒有人一次觀看10000行),而是使用skip()完成的分頁機制,並採取( )在服務器端。這也很好,很快,但爲了獲得匹配行的總量,我必須在某個地方進行計數。這個count()非常昂貴:從前端完整的請求週期和一些過濾器通常需要大約10到30毫秒,但是當我爲查詢添加一個計數時,這會增加到大約450 ms。加載分頁數據時行計數對性能有什麼影響?
現在我想知道如何繼續下去:我應該忽略這種延遲,只是和它一起生活嗎?或者是否有一種很好的方式來在不知道元素總數的情況下進行分頁?我的意思是,不知何故,前端需要知道行數,因爲它需要計算頁數並啓用/禁用「下一頁」按鈕等。
是否有解決此問題的好方法?
更新:這裏是我的代碼有一些意見:
var query = from x in db.ValueArchive select x;
// Filter by DatapointIds, if there are any
if (request.DatapointIds.Count>0)
{
query = query.Where(x => request.DatapointIds.Contains((int)x.DataPointId));
}
// Filter by StationIds, if there are any
if (request.StationIds.Count > 0)
{
query = query.Where(x => request.StationIds.Contains((int)x.StationId));
}
// Get number of matching rows after filtering
// This is the bottleneck!
response.numFound = query.Count();
// Paging
query = query.OrderBy(x => x.ID).Skip(request.Start == 0 ? 0 : request.Start-1).Take(request.Length);
// Add paging info to response
response.Start = request.Start;
response.Length = request.Length;
// Convert datetimes to ISO8601
response.Rows = query.Select(x => new { d = x.DataPointId, s = x.StationId, t = x.DateValue.Value, v = x.Value })
.ToList()
.Select(x => new { d = x.d, s = x.s, t = x.t.ToString("o"), v = x.v }).ToList<Object>();
任何代碼可能? – SeM
你可以嘗試分區。儘管沒有代碼,但我無法給你任何具體的想法。 – PacoDePaco
另外,列存儲索引可以對聚合查詢的性能做出奇蹟 – PacoDePaco