[英]Efficient query for only the first N rows for each unique ID
這是此問題的后續措施。
TLDR:
問題:
我想過濾查詢以僅保留每個唯一ID的前n行。
答案:
query = query.GroupBy(q => q.ID).SelectMany(g => g.Take(n));
這個答案的問題在於,對於80,000多個行,評估查詢所需的時間比通過迭代進行過濾( foreach
)的時間要長得多(至少慢兩倍)。 查看此答案生成的SQL,使用CROSS APPLY
,最有可能用於SelectMany()
。
該鏈接描述了CROSS APPLY
作用:
APPLY運算符允許您聯接兩個表表達式; 每次對左表表達式中的每一行都處理右表表達式。
簡而言之,我正在尋找一個過濾查詢,該查詢可以有效地收集每個唯一ID
的前N
行。
具有說明性SQL的Linq解決方案將是理想的選擇。
我在這里的 SQL中找到了答案(底部是SQL 2000解決方案),並設法實現了Queryable / Linq版本:
query = tableQueryable.Where(a =>
tableQueryable.Where(b => b.ID == a.ID)
.OrderByDescending(o => o.Timestamp)
.Take(N)
.Select(s => s.PK)
.Contains(a.PK)
).OrderByDescending(d => d.Timestamp);
一個相當標准的“子查詢”模式。 在大桌子上,速度要快得多。
L2S沒有行號,因此無法使用馬丁的把戲。 我也曾經遇到過這個問題,據我所知,這是最佳的L2S解決方案(不以任何方式使用本機SQL)。
您可以嘗試將所有結果下拉到應用程序中,然后在其中執行行號操作。 這可能會損害性能或提高性能。 它是哪一個取決於具體情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.