gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:31:28 27 4
gpt4 key购买 nike

我正在使用 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 排序时的情况)。

关于c# - SQL Linq .Take() 来自巨大数据库的最新 20 行,性能方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com