Skip to main content
 首页 » 编程设计

c#之SQL Linq .Take() 来自巨大数据库的最新 20 行,性能方面

2024年02月06日29leader

我正在使用 EntityFramework 6,我从 Asp.NET 服务器向 azure sql 数据库进行 Linq 查询。

我需要检索满足特定条件的最新 20 行

这是我的查询的粗略示例

using (PostHubDbContext postHubDbContext = new PostHubDbContext()) 
{ 
    DbGeography location = DbGeography.FromText(string.Format("POINT({1} {0})", latitude, longitude)); 
 
    IQueryable<Post> postQueryable = 
        from postDbEntry in postHubDbContext.PostDbEntries 
        orderby postDbEntry.Id descending 
        where postDbEntry.OriginDbGeography.Distance(location) < (DistanceConstant) 
        select new Post(postDbEntry); 
 
    postQueryable = postQueryable.Take(20); 
    IOrderedQueryable<Post> postOrderedQueryable = postQueryable.OrderBy(Post => Post.DatePosted); 
 
    return postOrderedQueryable.ToList(); 
} 

问题是,如果我的数据库中确实有十亿行怎么办。该查询是否会粗暴地选择满足条件的数百万行然后获取其中的 20 行?或者它会很聪明,意识到我只需要 20 行,因此它只会选择 20 行?

基本上,我如何使此查询高效地处理具有十亿行的数据库?

请您参考如下方法:

根据 http://msdn.microsoft.com/en-us/library/bb882641.aspx Take() 函数延迟了流式执行和 select 语句。这意味着它应该等同于 SQL 中的 TOP 20,并且 SQL 只会从数据库中获取 20 行。

此链接:http://msdn.microsoft.com/en-us/library/bb399342(v=vs.110).aspx显示 Take 在 Linq-to-SQL 中有直接翻译。

所以你唯一能做的就是数据库。就像@usr 建议的那样,您可以使用索引来提高性能。此外,按排序顺序存储表也有很大帮助(这很可能是您按 ID 排序时的情况)。