c# - 将 LINQ to EF 查询加速到最大

标签 c# asp.net sql-server asp.net-mvc linq

我有一个包含大量记录的数据库表,我预计它会在某一时刻增加到 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/

相关文章:

c# - 动态创建的链接按钮上的单击事件不起作用

asp.net - 使用没有 API key 的谷歌地图?

mysql - INSERT 期间的 MSSQL 格式日期和时间

SQL Server 奇怪的多列分组场景和 OR

c# - 如何在 C# 文件中自动放置标题文本(版权声明等)?

c# - 如何在 Visual Studio(而非 MSIL)中查看 C# 的汇编代码?

html - 无法自动将 Ionos 微软托管网站重定向到 https

asp.net - 脚本标签和链接标签是否进入asp :content or outside

java - SQL-将数字字符串转换为整数列表

c# - 我如何在 wpf 中为组合框的选定项目编写项目模板