【发布时间】:2017-01-16 13:39:04
【问题描述】:
我有一个包含大量记录的数据库表,我预计它会在某个时间点上升到 9 亿 - 10 亿条记录。
我想弄清楚的是如何加快我的 LINQ to SQL 查询,目前看起来像这样:
var allProducts = ctx.ProductsTransactions
.Where(x => x.SearchedUserID == User.SearchedUserID)
.ToList();
ctx 对象是我的实体对象(我的数据库的映射类)。
某些用户最多可以存储 25000 条记录,查询有时可能需要 10-15 秒才能显示记录。
附:我从数据库中检索的数据应该并且是只读的,不能以任何方式进行操作。
有什么办法可以加快这个查询的速度吗?
编辑:
好的,所以我在控制器中定义了我的实体对象,如下所示:
public db_Entity ctx = new db_Entity();
从数据库中提取数据后,我将其分组如下:
var prepared = allProducts.ToList();
var filteredProducts = prepared.GroupBy(x => x.ItemID).Select(x => new ResultItem()
{
ID = x.Key,
SaleNumber = x.Select(y => y.QuantityPurchased).Sum(),
SaleEarning = x.Select(y => y.QuantityPurchased * y.SalePrice).Sum(),
Title = x.Select(y => y.Title).FirstOrDefault(),
CurrentPrice = x.OrderByDescending(y=>y.TransactionDate).Select(y=>y.SalePrice).FirstOrDefault(),
GalleryURL = "http://somesite.com",
SalePrice = x.Select(y => y.SalePrice).FirstOrDefault()
}).ToList();
之后,我将过滤后的产品放入 viewbag 中,这样我就可以将其展示给最终用户,如下所示:
ViewBag.Products = filteredProducts;
你们需要更多关于表结构的信息吗?
编辑 #2:伙计们,你们中的许多人都提到我应该在我的 SQL 表中对 SearchedUserId 实施索引...我该怎么做?
【问题讨论】:
-
有上百万种方法可以加快速度,但我们需要更多地了解您的数据库/代码/数据/服务器/等。我们现在真正能做的就是确保您在
SearchedUserID列上有一个索引。 -
我的意思是这个网站不是问这种问题的好地方。我们需要非常具体的编程问题,而性能问题通常非常笼统。
-
@User987 您使用的是 LINQ to SQL 还是 LINQ to EF?如果 LINQ to SQL 无法将您写入的内容转换为 SQL,它会将所有内容加载到内存中。不要使用它。此外,简化您的查询。 LINQ 不是 SQL 的替代品。如果一个查询在 SQL 或 LINQ 中看起来很丑陋,那么它的性能就会很差。您必须检查生成的 SQL 语句以查看实际执行的内容
-
你应该考虑在服务器上实现分页,这样你就不必在页面加载时加载25k行,每次加载10、20或50行。
-
你也可以用这个
x.Sum(y => y.QuantityPurchased)替换这个x.Select(y => y.QuantityPurchased).Sum()
标签: c# asp.net sql-server asp.net-mvc linq