我有一个包含大量记录的数据库表,我预计它会在某一时刻增加到 9 亿 - 10 亿条记录。
我想弄清楚的是如何加速我的 LINQ to SQL 查询,目前看起来像这样:
var allProducts = ctx.ProductsTransactions
.Where(x => x.SearchedUserID == User.SearchedUserID)
.ToList();
其中 ctx 对象是我的实体对象(我的数据库的映射类)。
有些用户最多可以存储 25000 条记录,查询有时可能需要 10-15 秒才能显示记录。
附言我从数据库中检索的数据应该是只读的,不能以任何方式对其进行操作。
有什么方法可以加快这个查询的速度吗?
编辑:
好的,我已经在我的 Controller 中定义了我的实体对象,如下所示:
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();
之后,我将 filteredProducts 放入一个 viewbag 中,这样我就可以像这样向最终用户展示它:
ViewBag.Products = filteredProducts;
你们需要更多关于表结构的信息吗?
编辑#2:伙计们,你们中的许多人提到我应该在我的 SQL 表中对 SearchedUserId 实现索引......我该怎么做?
最佳答案
几乎每个人都提到过,首先想到的是在 SQL 中为您的 SearchedUserId
列添加一个索引:
CREATE NONCLUSTERED INDEX [idx_SearchedUserId]
ON ProductsTransactions ([SearchedUserId] ASC|DESC)
ON [filegroup_or_partition_name]
还有一些其他选项可以提高性能,例如微调服务器平台、硬件等(使用闪存也能显着提高性能)。
关于c# - 将 LINQ to EF 查询加速到最大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41677701/