簡體   English   中英

高效查詢每個唯一ID的前N行

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

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