efcore性能调优

yizhihongxing

性能调优——EFCore调优

按下硬件、网络不提,我们单表从程序层面对系统的性能进行优化,翻来覆去无外乎三个方面

缓存
异步
sql
本片文章,我们针对.net core web项目的ef core框架进行性能优化。

1. EF Core框架已经本地缓存机制memorycache,所以我们访问一个接口,二次访问的性能相比首次会提升一大截

2.尽可能的通过主键查询

3.在进行字符串模糊查询时,分为三种情况

//StartsWith,相当于sql语句的like 'A%'
var result= ProductContext.Products.Where(p => p.ProductName.StartsWith("A")).ToList();

//EndsWith,相当于sql语句的like '%A'
var result= ProductContext.Products.Where(p => p.ProductName.EndsWith("A")).ToList();

//Contains,相当于sql语句的like '%A%'
var result= ProductContext.Products.Where(p => p.ProductName.Contains("A")).ToList();
其中的Contains()会导致索引失效,不建议使用

4.指定列查询。即字段查询、传输需要时间,字段越多,所需的时间就越多,所以我们可以指定我们所需的字段

ProductContext.Products.Select(p =>new { p.ProductId, p.ProductName})
对应的sql为:

select ProductId,ProductName
from Products
5.分页查询(常用于客户端查询)

int pageIndex = 1;
int pageSize = 10;

var result= ProductContext.Products
.Where(p => p.ProductName.StartsWith("A"))
.Take(pageSize) // 限制结果集数量。
.Skip((pageIndex - 1) * pageSize) // 数据的偏移量
.ToList();
6.一次性查询数据量较多时(如导出报表),借助缓冲区处理,即直接ToList()、ToArray()

ps:某些时候使用缓冲区而不是缓存,是因为缓冲区使用时会清空,而缓存不到过期时间不自动清空,某些场景下会浪费内存空间

//默认流式处理,遍历使用result时每次循环都会查询数据库
var result= ProductContext.Products.Where(p => p.ProductName.StartsWith("A"));

//缓冲区处理(一次性将数据查出,使用result时,直接从队列中取数据)
var result= ProductContext.Products.Where(p => p.ProductName.StartsWith("A")).ToList();
7.EFCore会对查询出来的数据进行缓存、跟踪。跟踪监控造成额外的空间浪费,但能方便更新数据,所以在不涉及修改的情况下(只查询时),我们可以用AsNoTracking()方法来手动关闭跟踪

var result= ProductContext.Products
.Where(p => p.ProductName.StartsWith("A"))
.AsNoTracking()
.ToList();
8.使用异步 ToListAsync()

—————————以上为单个表数据的efcore优化—————————

原文链接:https://blog.csdn.net/YangWeiKe/article/details/130351397

原文链接:https://www.cnblogs.com/wugh8726254/archive/2023/04/29/17363553.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:efcore性能调优 - Python技术站

(0)
上一篇 2023年4月30日
下一篇 2023年4月30日

相关文章

  • C#怎样才能将XML文件导入SQL Server

    将XML文件导入SQL Server的过程需要经过以下步骤: 1. 创建目标表 首先需要在目标数据库中创建一张表,以存储从XML文件中读取到的数据。 CREATE TABLE [TableName] ( [Column1] [DataType], [Column2] [DataType], … [ColumnN] [DataType] ) 2. 读取XM…

    C# 2023年5月31日
    00
  • C#实现程序开机启动的方法

    以下是详细的讲解“C#实现程序开机启动的方法”的完整攻略。 1. 注册表 Windows系统提供了注册表,记录了Windows系统和各种软件的配置信息,其中的每一项都是一个键值对。可以通过修改注册表中相应的键值,实现程序的开机启动。 1.1 读取注册表 可以使用Microsoft.Win32.Registry类访问注册表,并读取相应的键值。以下是读取注册表中…

    C# 2023年6月6日
    00
  • C#键值对容器的介绍

    C#中的键值对容器主要指的是通过特定的键来访问元素的数据结构。它通常用于需要在某个特定条件下快速查找元素的情况,比如说搜索算法、缓存机制等。C#中的键值对容器有很多种,本文将从使用频率较高的Dictionary<TKey, TValue>和ConcurrentDictionary<TKey, TValue>两个类别来进行介绍。 Dic…

    C# 2023年6月1日
    00
  • c# 线程定时器 System.Threading.Timer的使用

    下面是对使用C#线程定时器System.Threading.Timer进行详细讲解的攻略。 1. Timer的基础知识 Timer是.NET Framework中的一个类,位于System.Threading.Timer命名空间下。它可用于在指定时间间隔内多次执行一个方法,也可以在指定延迟后执行一次。 在使用Timer之前,需要了解以下几个关键点: Time…

    C# 2023年5月15日
    00
  • C#通过JObject解析json对象

    下面是如何通过C#中的JObject类解析JSON对象的完整攻略: 1. 引用Newtonsoft.Json包 要使用JObject类来解析JSON对象,需要引用Newtonsoft.Json包。在Visual Studio中,可以通过NuGet包管理器安装引用。在Package Manager Console中执行以下命令即可: Install-Packa…

    C# 2023年5月31日
    00
  • .NET数组使用中的注意事项小结

    .NET数组使用中的注意事项小结 1. 数组基本介绍 在.NET中,数组是一种最常用的数据结构之一。数组是具有一定顺序关系的数据集合,可以使用整数作为下标(索引)访问数组中的元素。在使用数组时,需要注意以下几个点: 数组元素类型 数组长度 数组下标 数组越界 2. 数组元素类型 数组元素的类型可以是基本数据类型,也可以是引用类型。常见的基本数据类型有int、…

    C# 2023年6月7日
    00
  • C# datagridview、datagrid、GridControl增加行号代码解析

    下面我将详细讲解如何在C#中为DataGridView、DataGrid和GridControl控件添加行号,并提供两个示例。 1. DataGridView添加行号 在DataGridView中添加行号,可以借助其自带的行头显示索引的功能来实现。主要步骤如下: 设置行头的显示模式为行号:dataGridView1.RowHeadersVisible = t…

    C# 2023年5月15日
    00
  • C++联合体转换成C#结构的实现方法

    要将C++联合体转换成C#结构(struct),我们需要遵循以下步骤: 创建一个C#结构来表示C++联合体。这个结构的字段应该对应于联合体的成员变量,且顺序应该相同。例如,假设我们有下面这个C++联合体: union MyUnion { int i; float f; }; 对应的C#结构应该如下所示: [StructLayout(LayoutKind.Ex…

    C# 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部