【EF Core性能优化终极指南】:深入解析索引包含列的正确使用方式

第一章:索引包含列的核心概念与作用

在现代数据库系统中,索引是提升查询性能的关键机制之一。传统的索引通常只包含用于排序和查找的键列,但在某些场景下,查询需要返回非键列的数据,这会导致额外的回表操作,增加I/O开销。为解决这一问题,引入了“包含列”(Included Columns)的概念。

包含列的定义

包含列是指在创建非聚集索引时,将某些非键列附加到索引的叶层级,但不参与索引的排序结构。这些列仅用于覆盖查询所需的数据,从而避免访问基础表。
包含列的优势
  • 减少回表次数,提高查询效率
  • 支持更宽的覆盖索引,满足更多查询需求
  • 不影响索引键的大小,保持B+树结构高效

使用场景与示例

假设有一个订单表 Orders,常执行如下查询:
-- 查询订单状态和客户名称,但仅按订单ID过滤
SELECT Status, CustomerName 
FROM Orders 
WHERE OrderID = 10086;
若仅对 OrderID 建立索引,则需回表获取 Status 和 CustomerName。通过添加包含列可优化:
-- 创建带有包含列的非聚集索引
CREATE NONCLUSTERED INDEX IX_Orders_OrderID_Included
ON Orders (OrderID)
INCLUDE (Status, CustomerName);
该索引以 OrderID 作为键列进行排序,而 Status 和 CustomerName 存储在叶节点中,使查询完全覆盖于索引内。

限制与注意事项

项目说明
数据类型限制不能包含大型对象(LOB)类型如 text、xml 等
索引键长度包含列不计入索引键长度限制(900字节)
排序能力包含列无法用于 ORDER BY 或 GROUP BY

第二章:EF Core中索引包含列的理论基础

2.1 覆盖索引与查询性能的关系解析

覆盖索引是指查询所需的所有字段均包含在某个索引中,数据库无需回表查询主数据页。这种机制显著减少了I/O操作,提升查询效率。
覆盖索引的工作原理
当执行查询时,若索引已包含SELECT、WHERE、JOIN或ORDER BY中涉及的所有字段,优化器可直接从索引叶节点获取数据,避免访问聚簇索引。
示例分析
CREATE INDEX idx_user ON users (status, created_at);
SELECT status, created_at FROM users WHERE status = 'active';
上述语句中,idx_user覆盖了查询所有字段,执行计划将显示“Using index”,表示使用了覆盖索引。
性能对比
查询类型I/O次数响应时间(ms)
非覆盖索引3~512.4
覆盖索引12.1

2.2 包含列如何减少书签查找开销

在执行查询时,若非聚集索引无法覆盖所需字段,数据库引擎需通过书签查找(Bookmark Lookup)回表获取完整数据行,这一过程显著增加I/O开销。
包含列的作用机制
包含列允许将非键列附加到非聚集索引的叶级别,从而避免访问基表。这实现了“覆盖索引”的效果,同时不增加索引键大小。
  • 包含列不参与索引排序与比较,降低维护成本
  • 可添加大尺寸列(如 VARCHAR(MAX))而不影响索引结构
  • 显著减少随机I/O,提升查询性能
CREATE NONCLUSTERED INDEX IX_Orders_CustomerId 
ON Orders (CustomerId) 
INCLUDE (OrderDate, TotalAmount);
上述语句创建的索引,使查询 CustomerId、OrderDate 和 TotalAmount 时无需回表。包含列 OrderDate 和 TotalAmount 直接存储于索引叶节点,消除书签查找,大幅降低逻辑读取次数。

2.3 索引大小与选择性的权衡分析

在数据库优化中,索引的选择性与索引大小之间存在显著的权衡关系。高选择性索引能显著提升查询效率,但往往伴随着更大的存储开销。
选择性定义与计算
索引选择性是指索引列中唯一值的比例,理想值接近1。计算公式如下:
SELECT COUNT(DISTINCT column_name) / COUNT(*) FROM table_name;
该查询返回值越接近1,表示该列作为索引的区分度越高,查询时可过滤更多无效数据。
索引大小的影响因素
  • 字段类型:VARCHAR(255) 比 INT 占用更多空间
  • 复合索引长度:包含字段越多,B+树层级可能越深
  • 行数规模:数据量增长直接放大索引体积
性能对比示例
索引类型大小(MB)查询响应时间(ms)
单列高选择性1203
宽复合索引4801.5

2.4 SQL Server执行计划中的包含列识别

在SQL Server执行计划中,包含列(Included Columns)是优化非聚集索引覆盖查询的重要手段。通过将频繁访问但未用于筛选的字段添加到索引的叶层级,可避免键查找操作,提升查询性能。
执行计划中的识别特征
在执行计划的“Index Seek”或“Index Scan”操作中,若出现“Included Columns”属性,则表明该索引利用了包含列。可通过查看XML执行计划中的<IncludeColumnList>节点确认具体字段。
示例与分析
CREATE NONCLUSTERED INDEX IX_Orders_CustomerId 
ON Orders (CustomerId) 
INCLUDE (OrderDate, TotalAmount);
上述语句创建了一个以CustomerId为键列、包含OrderDate和TotalAmount的非聚集索引。当查询仅依赖这些字段时,执行计划将显示“Index Seek”,无需回表。
性能优势对比
  • 减少I/O开销:避免键查找带来的额外页读取
  • 提升缓存效率:更窄的键列结构增强内存利用率
  • 加速查询响应:覆盖索引直接满足SELECT字段需求

2.5 EF Core迁移对包含列的支持机制

EF Core 的迁移功能支持在索引中使用“包含列”(Included Columns),以提升查询性能。通过在索引中包含非键列,可避免回表操作,从而加快覆盖查询的执行速度。
配置包含列的语法
protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.CreateIndex(
        name: "IX_Orders_CustomerId",
        table: "Orders",
        column: "CustomerId",
        includedProperties: new[] { "OrderDate", "Total" });
}
该代码在 `CustomerId` 上创建索引,并将 `OrderDate` 和 `Total` 作为包含列。`includedProperties` 参数指定不参与索引排序但存储在叶节点中的字段。
应用场景与优势
  • 适用于仅需索引列和包含列即可满足查询需求的场景
  • 减少IO操作,提高SELECT查询效率
  • 特别适合宽表查询或数据仓库类应用

第三章:索引包含列的设计原则与最佳实践

3.1 如何合理选择包含列字段

在设计数据库索引时,合理选择包含列(Included Columns)能显著提升查询性能。包含列不会参与索引键的排序,但可存储在索引叶子节点中,从而避免回表操作。
包含列的选择原则
  • 优先选择查询中频繁出现在 SELECT 列表但未用于 WHERE、JOIN 或 ORDER BY 的字段
  • 避免将大字段(如 TEXT、BLOB)作为包含列,以免增大索引体积
  • 考虑覆盖索引效果,使查询完全命中索引而无需访问主表
示例:创建带包含列的索引
CREATE NONCLUSTERED INDEX IX_Orders_CustomerId 
ON Orders (CustomerId) 
INCLUDE (OrderDate, TotalAmount);
该语句在 CustomerId 上建立索引,并将 OrderDate 和 TotalAmount 作为包含列。当查询仅涉及这三个字段时,数据库可直接从索引获取全部数据,减少 I/O 开销。其中,INCLUDE 子句明确指定非键列,优化器更易生成高效执行计划。

3.2 高频查询场景下的包含列优化策略

在高频查询场景中,合理使用包含列(Included Columns)可显著提升索引覆盖能力,减少回表操作带来的性能损耗。
包含列的作用机制
通过将非键列添加到索引的 INCLUDE 部分,可在不增加索引键长度的前提下,使查询所需字段全部包含在索引页中,从而避免访问主表数据页。
典型应用示例
CREATE NONCLUSTERED INDEX IX_Orders_CustomerId 
ON Orders (CustomerId) 
INCLUDE (OrderDate, TotalAmount, Status);
该语句创建了一个以 CustomerId 为键列、包含常用查询字段的非聚集索引。当执行如下查询时:
SELECT OrderDate, TotalAmount 
FROM Orders 
WHERE CustomerId = '12345';
查询计划将完全基于索引完成,无需额外查找主表数据。
  • 减少 I/O 开销:避免从主表读取整行数据
  • 提升缓存效率:更小的索引页占用更少内存
  • 支持复合查询:常用于 WHERE + SELECT 字段分离场景

3.3 避免过度使用包含列导致的写入惩罚

在索引设计中,包含列(INCLUDED columns)能提升查询性能,但过度添加会导致写入性能下降。每条 INSERT 或 UPDATE 操作都需要将数据写入索引页,包含列越多,索引页越大,I/O 开销越高。
写入放大效应
当非聚集索引包含大量冗余字段时,会显著增加页面分裂和日志记录量。例如:
CREATE NONCLUSTERED INDEX IX_Orders_Customer 
ON Orders(CustomerID) INCLUDE (OrderDate, Amount, Status, Notes, Description)
上述语句中,Notes 和 Description 为大文本字段,频繁更新将导致页内空间不足,引发分裂。
优化建议
  • 仅包含查询中必要的覆盖字段
  • 避免包含 VARCHAR(MAX)、NTEXT 等大对象类型
  • 定期分析索引使用率,移除低效包含列

第四章:实际项目中的性能调优案例分析

4.1 案例一:从N+1查询到覆盖索引的演进

在早期实现中,订单详情页通过循环查询获取每个订单项的商品名称,导致典型的N+1查询问题:
SELECT * FROM orders WHERE user_id = 1;
-- 对每个订单执行
SELECT product_name FROM order_items WHERE order_id = ?;
该设计在用户订单量上升时引发性能瓶颈。优化的第一步是改用单次JOIN查询:
SELECT o.id, oi.product_name 
FROM orders o 
JOIN order_items oi ON o.id = oi.order_id 
WHERE o.user_id = 1;
虽然减少了查询次数,但仍有大量IO开销。最终引入覆盖索引,使查询完全在索引中完成:
CREATE INDEX idx_user_product ON order_items(user_id, product_name);
该索引包含查询所需全部字段,避免回表操作,显著提升响应速度。

4.2 案例二:大数据分页查询的性能飞跃

在处理千万级用户行为日志时,传统基于 OFFSET 的分页方式导致查询延迟高达数分钟。通过引入游标分页(Cursor-based Pagination),利用时间戳和唯一ID联合索引,显著提升查询效率。
优化前后对比
  • 原方案:LIMIT 1000000, 10 扫描百万行数据
  • 新方案:WHERE created_at < last_seen AND id < cursor_id
SELECT id, user_id, action, created_at
FROM user_logs
WHERE (created_at, id) < ('2023-08-01 10:00:00', 50000)
ORDER BY created_at DESC, id DESC
LIMIT 10;
该查询利用复合索引避免全表扫描,执行时间从 1200ms 降至 15ms。其中 (created_at, id) 联合索引确保排序一致性,防止数据跳跃。游标值由上一页最后一条记录生成,实现无缝翻页。
性能指标提升
指标优化前优化后
平均响应时间1200ms15ms
QPS836500

4.3 案例三:复合索引与包含列的协同优化

在高并发查询场景中,复合索引结合包含列(Included Columns)可显著提升覆盖查询性能。通过将高频过滤字段纳入索引键,而将非筛选但常投影的字段作为包含列,避免回表操作。
复合索引设计示例
CREATE NONCLUSTERED INDEX IX_Orders_CustomerDate 
ON Orders (CustomerId, OrderDate) 
INCLUDE (TotalAmount, Status);
上述语句创建的索引以 CustomerId 和 OrderDate 为键,TotalAmount 与 Status 为包含列。查询如 SELECT TotalAmount FROM Orders WHERE CustomerId = 5 AND OrderDate > '2023-01-01' 可完全命中索引,无需访问主表。
性能对比
查询类型逻辑读取次数执行时间(ms)
无索引124589
仅复合索引1812
复合索引+包含列64

4.4 案例四:通过包含列消除SELECT * 的隐患

在高并发系统中,使用 SELECT * 会带来性能损耗与数据冗余。通过引入“包含列”(Included Columns)机制,可在覆盖索引的基础上额外存储非键列,提升查询效率。
包含列的优势
  • 减少回表操作,提高查询速度
  • 避免全表扫描,降低 I/O 开销
  • 支持更灵活的查询覆盖
示例代码
CREATE NONCLUSTERED INDEX IX_Orders_CustomerId 
ON Orders (CustomerId) 
INCLUDE (OrderDate, TotalAmount);
该索引以 CustomerId 为键列,OrderDate 和 TotalAmount 作为包含列,使以下查询完全命中索引:
SELECT CustomerId, OrderDate, TotalAmount 
FROM Orders WHERE CustomerId = 1001;
逻辑分析:数据库无需访问数据页即可返回结果,显著提升性能。

第五章:未来展望与EF Core生态发展趋势

云原生与微服务集成深化
随着企业级应用向云原生架构迁移,EF Core 正在加强与 Kubernetes、Dapr 等平台的集成能力。例如,在 Azure 上部署 EF Core 应用时,可通过内置的 Azure SQL 弹性池支持实现自动连接池管理:
// 配置使用 Azure SQL 弹性连接
services.AddDbContextPool<AppDbContext>(options =>
    options.UseSqlServer(configuration.GetConnectionString("AzureSQL"),
        sqlOptions =>
        {
            sqlOptions.EnableRetryOnFailure(maxRetryCount: 5);
            sqlOptions.CommandTimeout(30);
        }));
性能优化与AOT编译支持
.NET 8 引入的 AOT(Ahead-of-Time)编译对 EF Core 提出新挑战。社区已推动引入轻量级查询管道,减少反射依赖。通过 CompiledModel 预生成元数据,可显著降低启动时间:
  • 使用 dotnet ef dbcontext optimize 命令预生成模型
  • 在容器化部署中减少冷启动延迟达 40%
  • 结合 Source Generators 自动生成高效映射代码
跨平台数据库适配扩展
EF Core 的数据库提供程序生态持续扩展,除主流 SQL Server、PostgreSQL 外,已出现对 ClickHouse、Cosmos DB 的实验性支持。以下为不同数据库提供商的性能对比示例:
数据库写入吞吐(TPS)查询延迟(ms)EF Core 支持版本
PostgreSQL12,5008.27.0+
Cosmos DB6,80015.47.0 (preview)
图:EF Core 在不同数据库提供程序下的基准测试结果(基于 TechEmpower 基准)
硬件单板类机考复习提纲 6、 功率晶体管低导通损耗时处于的状态(饱和状态、放大状态、截止状态)(放大器的采样频率特性)总结:元器件特性(电阻、电容、二极管、三极管、晶体、晶振、MOS、磁珠等)信号质量问题产生根因(单调性、边沿过缓、毛刺、回沟、抖动等)3、 几种电容容量范围大小(超级电容、钽电容、陶瓷电容、铝电容)66、背板连接器接触设计的接触顺序(先导向、再地针、最后信号针)28、逻辑电平接口的特性(CMOS、TTL、ECL、PECL)76、差分电平(lvpecl、RS-422/485、cml) 阅读详情

相关推荐

华为P812E光猫补全shell配置PON口模式

终于看到华为企业级的带2.5电口P812E横空出世了,相信很多发烧友也已经将此收入昂中。相信体验的同时,遇到的第一件事情就是配置PON口模式的问题,本文将带发烧基友解锁模式。

GUAIYU的博客 5734

EFCore性能优化方案-优化查询

数据库性能是一个宏大而复杂的主题,涉及整个组件堆栈:数据库、网络、数据库驱动程序和数据访问层(如 EF Core)。尽管高级层和 O/RM(如 EF Core)大大简化了应用程序开发并改善了可维护性,但它们有时可能是不透明的,隐藏了性能关键的内部详细信息,例如正在执行的 SQL。一些让人诟病的性能问题一直是热议话题,实际情况可能并不是性能差,而是需要掌握如何规避陷阱和避开影响性能的坑。

gcf10080353的博客 1234

【Apollo规划模块探秘】—— 场景(Scenario)驱动的决策引擎

本文深入解析了Apollo自动驾驶平台规划模块的核心机制——场景(Scenario)驱动的决策引擎。文章通过类比日常驾驶,阐述了规划模块如何像经验丰富的司机一样,根据不同的路况(如车道跟随、无保护左转)切换不同的“驾驶模式”。重点剖析了场景管理器(ScenarioManager)如何基于感知信息进行场景判断与切换,以及“场景-阶段-任务”双层状态机如何精密协作,实现灵活、高效且安全的轨迹规划。

rnn9storyteller的博客 278

EF Core 索引器属性(Indexer property)场景及应用

EF Core 中的索引器属性(Indexer Property)是指通过一个特殊的属性来访问实体类中的数据,而不必明确声明实体属性

weixin_39842602的博客 940

微信小程序:errno: 600001, errMsg: “uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::E

微信小程序报错uploadFile:fail errcode:-101 cronet_error_code:-10001 error_msg:net::ERR_CONNECTION_RESET, custum ip is invalid, didn't find user's ip,wx.uploadFile errno: 600001 errcode:-101 ?微信小程序wx.uploadFile错误,wx.uploadFile 在真机上报下面的错误,调试工具里没有问题,其它接口在真机/调试工具都正常,

✅ 精选推荐文章 4260

【译】索引进阶(五):带有包含列的索引

【译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正】 原文链接:传送门。 之前的系列文章介绍了聚集索引和非聚集索引,着重讲解了以下几个方面的内容: 对于表中的每一行来说,索引中总是存在这一个条目与它对应(注:此例外规则将在以后予以关注)。这些条目总是按索引键排序。 在聚集索引中...

weixin_30251587的博客 741

【图论】系列(一)之图论的构成

图论是研究图的数学分支,本章介绍了图论的基本构成和概念

qq_30066733的博客 748

ef mysql索引_第十三节:数据库索引相关和EFCore的索引映射

一. 简介1.背景索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,数据库能快速到达一个位置去搜索数据。2.含义索引是一个单独的,存储在磁盘上的数据结构,它们包含对数据表里所有记录的引用指针,使用索引用于快速找出在某个或多个列中有某一特定值的行,对相关列使用索引是降低查询操...

weixin_35675138的博客 779

23、电器元件符号及封装大全(2025版本)

总计28类电器元件符号和封装。

XU157303764的博客 2656

[Python] 如何使用 Python 调用 Dify 工作流服务实现自动化翻译

本文介绍了如何使用Python调用Dify的API实现文本翻译自动化。Dify作为AI开发平台,其工作流功能可执行文本处理、翻译等任务。选择Python调用Dify的优势在于职责划分清晰:Dify专注AI服务,Python处理文件操作等非AI任务。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1097

mysql 索引项 包含列

数据库相关学习资料:https://edu.51cto.com/video/655.htmlMySQL 索引项包含列:初学者指南 作为一名经验丰富的开发者,我很高兴能帮助刚入行的小白了解如何在MySQL中实现“索引项包含列”。索引是数据库中非常重要的概念,它可以帮助我们提高查询效率。本文将详细介绍实现过程,并提供必要的代...

weixin_36054213的博客 193

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。10. 注意,如果从移动设备浏览器连接服务,信令服务器的SSL证书一定要先设好。想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。8. 打开电脑浏览器,地址栏输入http://127.0.0.1,点击Receiver Sample。新建Unity项目,模板选Third Person,Project Name随意。启动App,控制台出现如下信息表示成功。

每日出拳老爷子的博客 2518

EF Core索引优化的秘密武器:包含列到底该怎么用才不踩雷?

掌握EF Core索引优化关键,深入解析EF Core的索引包含列使用技巧。涵盖查询性能提升场景、正确配置方法及避免冗余索引的实战要点,显著加快数据检索速度。合理利用包含列可减少回表查询,提升覆盖索引效率,值得收藏。

CompiGlow的博客 1004

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

EF Core计算列:使用数据库计算字段的现代方法

还在手动拼接字符串字段或在代码中计算派生值吗?EF Core的计算列功能让你直接在数据库层面实现字段计算,提升性能并保持数据一致性。本文将深入解析EF Core计算列的使用方法、最佳实践和高级场景。 ## 什么是计算列? 计算列(Computed Column)是数据库中的一种特殊列,其值由数据库根据其他列的值自动计算得出。EF Core通过`HasComputedColumnSql()`方法...

gitblog_00141的博客 1053

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

终极指南:EF Core唯一约束完全解决方案——从入门到精通

你是否还在为数据库重复数据头疼?用户邮箱重复导致登录异常?订单号冲突引发财务对账困难?本文将系统讲解EF Core(Entity Framework Core)中实现数据唯一性的两种核心方案,带你彻底解决数据重复问题。读完本文,你将掌握: - 备用键(Alternate Key)与唯一索引(Unique Index)的选型决策 - 单字段与复合字段唯一约束的代码实现 - 约束命名、筛选条件等高级配...

gitblog_01187的博客 644

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【EF Core性能优化核心】:索引配置的4大误区与破局之道

掌握EF Core性能优化关键,避开Entity Framework Core 索引配置常见误区。详解模型映射、唯一索引、复合索引等应用场景与正确配置方法,提升查询效率。避免性能瓶颈,值得收藏。

AlgoInk的博客 671

EF Core索引设计必知:Include列如何避免聚集索引查找,实现覆盖索引?

掌握EF Core索引包含列技巧,有效避免聚集索引查找。通过Include列实现覆盖索引,提升查询性能,适用于高频读取场景。合理设计可减少IO开销,优化数据库响应速度,值得收藏。

ProcePerch的博客 444

【EF Core索引优化终极指南】:揭秘包含列(Index Include)的5大应用场景与性能提升秘诀

掌握EF Core索引包含列优化技巧,提升查询性能50%以上。详解5大应用场景与Include列使用方法,覆盖覆盖索引、减少键查找等关键优势,有效加速数据检索。EF Core索引包含列实战指南,值得收藏。

SimProceed的博客 276

告别低效查询:EF Core 字符串包含检查的性能优化与警告处理指南

在 .NET 开发中,EF Core 作为强大的对象关系映射(ORM)框架,极大简化了数据库操作。但在处理字符串包含检查时,许多开发者可能会遇到性能瓶颈。本文将分享如何优化 EF Core 中的字符串包含查询,避免常见陷阱,并正确处理相关警告,让你的数据库操作更高效。 ## 字符串包含查询的常见问题 在 EF Core 中,开发者常使用 `string.Contains` 方法进行字符串包含查

gitblog_00756的博客 525

EF Core Index Include全解析,彻底搞懂非键列在索引中的作用与限制

掌握EF Core索引包含列的正确用法,解决查询性能瓶颈。详解IncludeProperties在索引中的应用,提升覆盖查询效率,避免回表操作。涵盖配置方法、适用场景与使用限制,助你优化数据库性能,值得收藏。

FuncLens的博客 336

EF Core索引配置全解析:从入门到生产级优化的4个阶段

掌握EF Core的索引配置技巧,提升数据库查询性能。本文详解EF Core的索引应用场景、模型配置方法、唯一性与覆盖索引优化,助力从开发到生产级应用的性能跃迁,值得收藏

PixelFlow的博客 976

EF Core多表查询性能翻倍的秘密:揭秘Join、GroupJoin与SelectMany的正确用法

掌握EF Core多表连接查询性能优化秘诀,深入解析Join、GroupJoin与SelectMany的适用场景与正确用法。显著提升查询效率,减少数据库负载,实现高效数据关联。方法实用,效果显著,值得收藏。

LogicGap的博客 1067

为什么你的EF Core查询总是N+1?ThenInclude多级包含避坑全指南

掌握EF Core 的 ThenInclude 多级加载技巧,有效避免N+1查询性能陷阱。适用于复杂导航属性场景,通过链式包含一次性加载关联数据,提升查询效率。合理使用可大幅减少数据库往返次数,优化应用性能,值得收藏。

PixelGlow的博客 818

EF Core 9不再慢吞吞:批量操作+智能索引=秒级响应的终极组合

掌握EF Core 9的性能秘诀,轻松实现秒级响应。本文深入解析Entity Framework Core 9 的批量操作与索引优化,涵盖高并发场景下的数据插入、更新及查询性能提升技巧,通过批量执行与智能索引策略显著减少数据库往返时间,大幅提升应用效率,值得收藏。

LogicNest的博客 878

Npgsql EF Core终极特性解析:JSON、数组与范围查询全攻略

Npgsql EF Core作为PostgreSQL的Entity Framework Core提供程序,为开发者提供了强大的数据访问能力。本文将深入解析其三大核心特性:JSON数据处理、数组操作和范围查询,帮助你轻松应对复杂数据场景。 [![PostgreSQL数据库标志](https://raw.gitcode.com/gh_mirrors/ef/efcore.pg/raw/bd07c342

gitblog_00698的博客 1092
上一篇: ASP.NET Core路由约束性能优化秘籍:提升响应速度的7个关键点
下一篇: GroupBy 后如何提取数据?3种必掌握的后续操作模式,99%的人只用了1种
VarLens
博客等级 码龄1年 168粉丝 2188原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值