efcore性能调优

性能调优——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/p/17363553.html

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

(0)
上一篇 2023年5月5日
下一篇 2023年5月5日

相关文章

  • C#职责链模式实例详解

    C#职责链模式实例详解 什么是职责链模式 职责链模式是一种行为型设计模式,它允许您将请求沿着处理链进行传递,直到它被处理为止。职责链模式由以下角色组成: 抽象处理程序:定义用于处理请求的通用接口,并保存指向其后继者的引用。 具体处理程序:处理它所能处理的请求,可以访问其后继者,并向后继者委派无法处理的请求。 客户端:将请求发送到处理程序以处理它。 具体的职责…

    C# 2023年6月1日
    00
  • C# String.Substring()方法: 检索此字符串中子字符串的指定部分

    String.Substring() 可以用于获取字符串的子串,它的作用是返回一个新的字符串,该字符串是原字符串的一个子集。 使用方法 String.Substring()的使用方法如下: string.Substring(int startIndex) string.Substring(int startIndex, int length) 其中,star…

    C# 2023年4月19日
    00
  • 浅析C# 结构体struct

    接下来我将为您详细讲解“浅析C#结构体struct”的完整攻略。 什么是结构体struct C#中结构体(struct)是一种用户自定义类型,它与类class类似,可以包含字段、属性、方法等成员,但有一些区别。结构体是一个值类型,它们的实例通常分配在堆栈上并以此方式处理比引用类型更快。另外,结构体可以被作为参数和返回值传递。 如何定义结构体struct 定义…

    C# 2023年5月15日
    00
  • React实现全局组件的Toast轻提示效果

    以下是“React实现全局组件的Toast轻提示效果”的完整攻略,包括什么是Toast轻提示、如何实现全局组件的Toast轻提示效果以及两个示例。 什么是Toast轻提示? Toast轻提示是一种常见的用户界面元素,用于在屏幕上显示短暂的消息或通知。Toast轻提示通常以半透明的方式出现在屏幕的底部或中心位置,显示一条简短的文本消息,然后在几秒钟后自动消失。…

    C# 2023年5月15日
    00
  • C#计算输入汉字GBK编码后十六进制数输出的方法

    C#计算输入汉字GBK编码后十六进制数输出的方法 在C#编程中,计算输入汉字GBK编码后的十六进制数输出,可以使用以下代码实现。 代码实现 using System.Text; public string ToGBKHexString(string text) { var encoding = Encoding.GetEncoding("GBK&q…

    C# 2023年6月7日
    00
  • C# File.ReadAllBytes(string path):读取指定文件的所有字节内容

    File.ReadAllBytes(string path)是C#中一个用于读取指定文件的字节流并将其以字节数组的形式返回的方法。 作用: 该方法用于将指定文件中的所有字节读入一个字节数组中,并返回该字节数组。可以使用此方法来读取任何类型的文件,包括图像、声音和文本文件等。 使用方法攻略: 要使用File.ReadAllBytes方法,需要在代码中使用以下命…

    C# 2023年4月19日
    00
  • C# BinaryReader.Close – 关闭二进制读取器

    C#中的BinaryReader类是一个自.NET Framework 1.1版本引入的类,用于从二进制流中读取基本数据类型。该类有一个Close方法,本文将详细讲解该方法的作用和使用方法。 关于BinaryReader.Close方法的作用 BinaryReader.Close方法用于关闭BinaryReader对象读取的流。当对象读取完成后,应该尽快关闭…

    C# 2023年4月19日
    00
  • C#使用System.Buffer以字节数组Byte[]操作基元类型数据

    操作基元类型数据时,我们通常需要进行数据类型转换,进行字节序列转换。而C#中的System.Buffer类提供了方便的功能,可以以字节数组Byte[]的形式对基本类型进行操作。以下是C#使用System.Buffer以字节数组Byte[]操作基元类型数据的完整攻略: 1. 引入命名空间 为了使用System.Buffer类,必须在代码中引入该命名空间。在代码…

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