问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C#性能优化:大批量数据操作详解与示例代码

创作时间:
作者:
@小白创作中心

C#性能优化:大批量数据操作详解与示例代码

引用
CSDN
1.
https://m.blog.csdn.net/cplvfx/article/details/145877865

在C#开发中,性能优化是提升系统响应速度和资源利用率的关键环节。特别是在处理大批量数据操作时,合理的优化策略可以显著提升应用程序的整体性能。本文将详细介绍在进行大批量数据查询和删除时的具体优化方法,并提供相应的示例代码。

11.大批量数据操作

当需要对数据库进行大批量数据操作的时候,推荐使用分批操作的功能,比如一百万条数据将其分为每一万条数据进行数据库操作,而不是每条数据循环去进行操作。

查询

分批查询对数据库的压力较小,如果那一张表在这个时候可能其他地方也更新或新增 可能需要考虑增加with(NOLOCK) ,当然如果是EF 就套上读未提交的事务(会变卡) 也可以让查询不加锁。

当执行大规模数据查询时,分批查询可以显著降低对数据库的压力,并提高响应速度。具体方法包括但不限于:

  • 使用分页查询:通过限制每次查询返回的数据量(如每批次10,000条记录),并使用偏移量或标识符来追踪已经检索的数据。
  • 增加
    WITH (NOLOCK)
    提示
    :在SQL Server中,
    WITH (NOLOCK)
    提示允许查询在不请求共享锁的情况下读取数据,这可以避免由于其他事务持有排他锁而造成的阻塞问题。但需要注意的是,使用
    NOLOCK
    可能会导致脏读(读取到未提交的数据)。
  • Entity Framework中的读未提交隔离级别:在EF中可以通过设置事务的隔离级别为
    ReadUncommitted
    来达到类似
    WITH (NOLOCK)
    的效果。虽然这种方法能减少锁定,但也可能导致脏读。
using (var context = new YourDbContext())
{
    using (var transaction = context.Database.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
    {
        // 执行你的查询逻辑
        var queryResult = context.YourEntities.ToList();
        
        transaction.Commit();
    }
}

删除

首推根据主健进行删除,因为数据库根据主键的索引查找和删除数据非常快,当然分批更好。

对于大批量数据的删除操作,以下策略有助于提升效率:

  • 基于主键删除:由于数据库通常会为主键创建索引,因此根据主键进行删除是最快的方法之一。
  • 分批删除:将要删除的数据分为多个小批次进行操作,以减轻数据库压力。例如,每次只删除一定数量的记录,直到所有需要删除的数据都被处理完毕。

下面是一个简单的示例,展示了如何使用C#和ADO.NET实现基于主键的分批删除:

public void BatchDelete(string connectionString, string tableName, List<int> ids)
{
    const int batchSize = 1000;
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        for (int i = 0; i < ids.Count; i += batchSize)
        {
            var batchIds = ids.Skip(i).Take(batchSize);
            string inClause = string.Join(",", batchIds);
            string sql = $"DELETE FROM {tableName} WHERE Id IN ({inClause})";
            
            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                command.ExecuteNonQuery();
            }
        }
    }
}

这个例子中,我们定义了一个批量大小
batchSize
,然后循环遍历所有的ID列表,每次构建一个仅包含当前批次内ID的IN子句,从而实现分批删除。

记住,在进行任何大批量数据操作之前,最好先评估这些操作对数据库性能的影响,并考虑在非高峰时段执行这些任务。此外,确保有适当的备份和恢复计划以防万一。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号