【C#】使用DeepSeek帮助评估数据库性能问题,C# 使用定时任务,每隔一分钟移除一次表,再重新创建表,和往新创建的表追加5万多条记录
🌹欢迎来到《小5讲堂》🌹
🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹
🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!🌹

目录
- 前言
- DeepSeek回答
- 存在性能问题
- 1. **表删除与创建的开销**
- 2. **插入大量数据的开销**
- 3. **对服务器资源的消耗**
- 4. **对并发操作的影响**
- 5. **日志和备份的影响**
- 6. **替代方案**
- 7. **性能监控**
- 总结
- DS解决方案
- 1. **使用临时表(`#TempTable`)**
- 2. **使用表分区(Partitioning)**
- 3. **使用批量插入和删除**
- 4. **使用内存优化表(In-Memory OLTP)**
- 5. **使用队列或消息表**
- 总结
- 博主解决方案
- 相关文章
前言
最近DeepSeek很火,好像各行各业都在对接TA,甚至各大厂都接上他们的模型。
主要是因为TA属于类文本垂直生成,相对于通用模型会更加专注,训练和投喂的数据量和质量肯定会比较高,再加上TA高效的算法,输出的内容质量就更加高,得到的认可度就高。
基于这个,本篇文章通过DS来评估下数据库性能问题。
DeepSeek回答
存在性能问题
在SQL Server中,每隔一分钟删除并重新创建表,然后插入5万多条记录,确实会对服务器性能产生显著影响。以下是一些关键点:
1. 表删除与创建的开销
- 删除表:
DROP TABLE操作会释放表的所有资源,包括索引、约束等,涉及大量元数据操作和日志记录。 - 创建表:
CREATE TABLE操作需要重新定义表结构,分配存储空间,并更新系统目录。
频繁执行这些操作会导致:
- 锁争用:删除和创建表时,SQL Server会对系统表加锁,可能阻塞其他查询。
- 日志增长:每次操作都会产生大量日志,可能导致日志文件快速增长,影响性能。
2. 插入大量数据的开销
- 插入5万多条记录:每次插入大量数据会增加事务日志的负担,可能导致日志文件频繁增长,甚至触发自动增长操作,进一步影响性能。
- 索引维护:如果表有索引,插入数据时会触发索引维护,增加CPU和I/O开销。
3. 对服务器资源的消耗
- CPU和I/O:频繁的表操作和大量数据插入会消耗大量CPU和磁盘I/O资源,可能影响其他查询的性能。
- 内存:SQL Server需要为每次操作分配内存,频繁操作可能导致内存压力增加。
4. 对并发操作的影响
- 阻塞:删除和创建表时,SQL Server会对表加锁,可能阻塞其他查询,影响并发性能。
- 死锁风险:频繁的表操作增加了死锁的可能性,尤其是在高并发环境中。
5. 日志和备份的影响
- 日志增长:频繁的表操作和大量数据插入会导致事务日志快速增长,增加日志管理难度。
- 备份:如果启用了事务日志备份,频繁的日志增长会增加备份的频率和大小。
6. 替代方案
- 使用临时表:如果数据是临时性的,可以考虑使用临时表(
#TempTable),它们在会话结束时自动删除,减少对系统表的影响。 - 分区表:如果数据需要频繁清理,可以考虑使用分区表,通过切换分区来快速删除数据。
- 批量删除和插入:如果必须保留表结构,可以考虑批量删除和插入数据,而不是删除和重新创建表。
7. 性能监控
- 监控工具:使用SQL Server自带的性能监控工具(如SQL Server Profiler、Extended Events、DMVs)来监控表操作对服务器性能的影响。
- 日志和资源使用:定期检查事务日志大小、CPU使用率、磁盘I/O等指标,确保系统资源在可控范围内。
总结
频繁删除和创建表,并插入大量数据,会对SQL Server的性能产生显著影响,尤其是在高并发或资源有限的环境中。建议考虑替代方案,如使用临时表或分区表,以减少对系统资源的消耗和性能的影响。如果必须采用当前方案,务必密切监控服务器性能,并确保有足够的资源来处理这些操作。
DS解决方案
是的,有更好的方法来处理这种需求,避免频繁删除和创建表带来的性能问题。以下是几种更高效的替代方案:
1. 使用临时表(#TempTable)
如果数据是临时性的,可以使用SQL Server的临时表。临时表在会话结束时自动删除,避免了频繁删除和创建表的开销。
// C# 示例
using (var connection = new SqlConnection(connectionString))
{connection.Open();// 创建临时表var createTempTable = @"CREATE TABLE #TempTable (ID INT PRIMARY KEY,Data NVARCHAR(255));";new SqlCommand(createTempTable, connection).ExecuteNonQuery();// 插入数据for (int i = 0; i < 50000; i++){var insertCommand = new SqlCommand("INSERT INTO #TempTable (ID, Data) VALUES (@ID, @Data)", connection);insertCommand.Parameters.AddWithValue("@ID", i);insertCommand.Parameters.AddWithValue("@Data", "Sample Data " + i);insertCommand.ExecuteNonQuery();}// 使用临时表进行查询或其他操作var selectCommand = new SqlCommand("SELECT * FROM #TempTable", connection);var reader = selectCommand.ExecuteReader();while (reader.Read()){// 处理数据}
}
优点:
- 临时表在会话结束后自动删除,无需手动清理。
- 减少对系统表的频繁操作。
缺点:
- 临时表仅在当前会话中可见,不适合跨会话共享数据。
2. 使用表分区(Partitioning)
如果数据需要定期清理,可以使用表分区技术。通过分区切换,可以快速删除旧数据,而不需要删除整个表。
步骤:
- 创建一个分区函数和分区方案。
- 将表按时间或其他条件分区。
- 使用
SWITCH语句快速删除旧分区。
-- 创建分区函数
CREATE PARTITION FUNCTION MyPartitionFunction (DATETIME)
AS RANGE RIGHT FOR VALUES ('2023-01-01', '2023-02-01');-- 创建分区方案
CREATE PARTITION SCHEME MyPartitionScheme
AS PARTITION MyPartitionFunction
TO ([PRIMARY], [PRIMARY], [PRIMARY]);-- 创建分区表
CREATE TABLE MyPartitionedTable (ID INT PRIMARY KEY,Data NVARCHAR(255),CreatedDate DATETIME
) ON MyPartitionScheme(CreatedDate);-- 切换分区以删除旧数据
ALTER TABLE MyPartitionedTable
SWITCH PARTITION 1 TO StagingTable; -- 将旧分区数据切换到临时表
TRUNCATE TABLE StagingTable; -- 清空临时表
优点:
- 快速删除旧数据,性能开销低。
- 适合按时间或其他条件清理数据的场景。
缺点:
- 需要提前规划和设计分区策略。
- 对表结构有一定要求。
3. 使用批量插入和删除
如果必须保留表结构,可以通过批量删除和插入数据来减少操作频率。
步骤:
- 使用
TRUNCATE TABLE快速清空表(比DELETE更快)。 - 使用批量插入(如
SqlBulkCopy)高效插入数据。
// C# 示例
using (var connection = new SqlConnection(connectionString))
{connection.Open();// 清空表var truncateCommand = new SqlCommand("TRUNCATE TABLE MyTable", connection);truncateCommand.ExecuteNonQuery();// 使用 SqlBulkCopy 批量插入数据using (var bulkCopy = new SqlBulkCopy(connection)){bulkCopy.DestinationTableName = "MyTable";var dataTable = new DataTable();dataTable.Columns.Add("ID", typeof(int));dataTable.Columns.Add("Data", typeof(string));for (int i = 0; i < 50000; i++){dataTable.Rows.Add(i, "Sample Data " + i);}bulkCopy.WriteToServer(dataTable);}
}
优点:
TRUNCATE TABLE比DELETE更快,且不会产生大量日志。SqlBulkCopy是高效的批量插入工具,性能远高于逐条插入。
缺点:
- 仍然需要清空表,可能不适合某些场景。
4. 使用内存优化表(In-Memory OLTP)
如果数据访问频率高且对性能要求极高,可以考虑使用内存优化表。内存优化表将数据存储在内存中,适合高并发和频繁写入的场景。
步骤:
- 启用内存优化功能。
- 创建内存优化表。
-- 启用内存优化
ALTER DATABASE MyDatabase
ADD FILEGROUP MyMemoryOptimizedFileGroup CONTAINS MEMORY_OPTIMIZED_DATA;ALTER DATABASE MyDatabase
ADD FILE (NAME='MyMemoryOptimizedFile', FILENAME='C:\Data\MyMemoryOptimizedFile')
TO FILEGROUP MyMemoryOptimizedFileGroup;-- 创建内存优化表
CREATE TABLE MyMemoryOptimizedTable (ID INT PRIMARY KEY NONCLUSTERED,Data NVARCHAR(255)
) WITH (MEMORY_OPTIMIZED = ON);
优点:
- 数据存储在内存中,读写性能极高。
- 适合高并发和频繁写入的场景。
缺点:
- 需要足够的内存资源。
- 对硬件要求较高。
5. 使用队列或消息表
如果数据是逐步生成的,可以使用队列或消息表的方式,逐步插入数据,而不是一次性插入大量数据。
步骤:
- 创建一个消息表,用于存储待处理的数据。
- 使用定时任务逐步处理数据。
-- 创建消息表
CREATE TABLE MessageTable (ID INT IDENTITY PRIMARY KEY,Data NVARCHAR(255),Processed BIT DEFAULT 0
);-- 插入数据
INSERT INTO MessageTable (Data) VALUES ('Sample Data 1');
INSERT INTO MessageTable (Data) VALUES ('Sample Data 2');-- 处理数据
UPDATE MessageTable
SET Processed = 1
WHERE Processed = 0;
优点:
- 数据逐步插入,减少一次性插入的压力。
- 适合流式数据处理场景。
缺点:
- 需要额外的逻辑来处理数据。
总结
根据你的具体需求,可以选择以下方案:
- 临时表:适合临时数据存储。
- 表分区:适合按时间或其他条件清理数据。
- 批量插入和删除:适合需要保留表结构的场景。
- 内存优化表:适合高性能和高并发的场景。
- 队列或消息表:适合逐步处理数据的场景。
选择最合适的方案可以显著提升性能,并减少对SQL Server的影响。
博主解决方案
直接查询关联表数据到缓存里,可以是内存或者Redis里。
相关文章
【C#】使用DeepSeek帮助评估数据库性能问题,C# 使用定时任务,每隔一分钟移除一次表,再重新创建表,和往新创建的表追加5万多条记录
【C#】合理使用DeepSeek相关AI应用为我们提供强有力的开发工具,在.net core 6.0框架下使用JsonNode动态解析json字符串,如何正确使用单问号和双问号做好空值处理
【C#】已经实体类和动态实体类的反射使用方法,两分钟回顾,码上就懂
【C#】使用vue3的axios发起get和post请求.net framework部署的API显示跨域
【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据
【C#】pdf按页分割文件,以及分页合并,效果还不错,你值得拥有
【C#】未能加载文件或程序集“CefSharp.Core.Runtime.dll”或它的某一个依赖项。找不到指定的模块。
【C#】.net core 6.0 在program时间格式统一json格式化,并列举program默认写法和简化写法
【C#】.net core 6.0 ApiController,API控制器方法,API接口以实体类作为接收参数应该注意的点
【C#】 SortedDictionary,查找字典中是否存在给定的关键字
【C#】.net core 6.0 MVC返回JsonResult显示API接口返回值不可被JSON反序列化
【C#】.net core 6.0 使用第三方日志插件Log4net,配置文件详细说明
【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇
【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),流程描述篇
【C#】约瑟夫原理举例2个代码实现
【C#】List泛型数据集如何循环移动,最后一位移动到第一位,以此类推
【C#】获取文本中的链接,通过正则表达式的方法获取以及优化兼容多种格式
温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀博主,可查看博主个人中心查看信息。
相关文章:
【C#】使用DeepSeek帮助评估数据库性能问题,C# 使用定时任务,每隔一分钟移除一次表,再重新创建表,和往新创建的表追加5万多条记录
🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…...
【openGauss】物理备份恢复
文章目录 1. gs_backup(1)备份(2)恢复(3)手动恢复的办法 2. gs_basebackup(1)备份(2)恢复① 伪造数据目录丢失② 恢复 3. gs_probackup(1…...
蓝桥杯备赛-基础练习 day1
1、闰年判断 问题描述 给定一个年份,判断这一年是不是闰年。 当以下情况之一满足时,这一年是闰年:1.年份是4的倍数而不是100的倍数 2.年份是400的倍数。 其他的年份都不是闰年。 输入格式 输入包含一个…...
实验四 Python聚类决策树训练与预测 基于神经网络的MNIST手写体识别
一、实验目的 Python聚类决策树训练与预测: 1、掌握决策树的基本原理并理解监督学习的基本思想。 2、掌握Python实现决策树的方法。 基于神经网络的MNIST手写体识别: 1、学习导入和使用Tensorflow。 2、理解学习神经网络的基本原理。 3、学习使用…...
【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]
起因 在公共高性能服务器上运行OllamaDeepSeek,如果按照默认配置启动Ollama程序,则自己在远程无法连接你启动的Ollama服务。 如果修改配置,则会遇到你的Ollama被他人完全控制的安全风险。 不过,我们可以使用一个方向代理&#…...
网络_面试_HTTP请求报文和HTTP响应报文
简介: HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。 HTTP请求报文 一个HTTP请求报文由请求行(request line)、请求头部&…...
详解CPU的组成与功能
CPU的组成与功能 一、 控制单元(Control Unit, CU)二、 算术逻辑单元(Arithmetic Logic Unit, ALU)三、 寄存器(Registers)四、 高速缓存(Cache)五、 辅助结构与技术译码器ÿ…...
Spring boot3-WebClient远程调用非阻塞、响应式HTTP客户端
来吧,会用就行具体理论不讨论 1、首先pom.xml引入webflux依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 别问为什么因为是响应式....…...
18 | 实现简洁架构的 Handler 层
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入 云原生 AI 实战 星球,12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra);本节课最终…...
《Transformer如何进行图像分类:从新手到入门》
引言 如果你对人工智能(AI)或深度学习(Deep Learning)感兴趣,可能听说过“Transformer”这个词。它最初在自然语言处理(NLP)领域大放异彩,比如在翻译、聊天机器人和文本生成中表现出…...
coding ability 展开第三幕(滑动指针——基础篇)超详细!!!!
文章目录 前言滑动窗口长度最小的子数组思路 无重复字符的最长子串思路 最大连续1的个数思路 将x减到0的最小操作数思路 总结 前言 前面我们已经把双指针的一些习题练习的差不多啦 今天我们来学习新的算法知识——滑动窗口 让我们一起来探索滑动窗口的魅力吧 滑动窗口 滑动窗口…...
RAGFlow版本升级-Win10系统Docker
下载源码压缩包 https://github.com/infiniflow/ragflow.git 删除旧版本代码文件夹,把下载的代码解压到原先目录 更新一下env文件:ragflow/docker/.env 把值改为最新版本即可 RAGFLOW_IMAGEinfiniflow/ragflow:v0.17.1 更新一下docker docker compose -…...
通过mybatis的拦截器对SQL进行打标
1、背景 在我们开发的过程中,一般需要编写各种SQL语句,万一生产环境出现了慢查询,那么我们如何快速定位到底是程序中的那个SQL出现的问题呢? 2、解决方案 如果我们的数据访问层使用的是mybatis的话,那么我们可以通过…...
如何自己做奶茶,从此告别奶茶店
自制大白兔奶茶,奶香与茶香激情碰撞,每一口都是香浓与甜蜜的双重诱惑,好喝到跺脚!丝滑口感在舌尖舞动,仿佛味蕾在开派对。 简单几步就能复刻,成本超低,轻松在家享受奶茶自由。 材料:大白兔奶糖&…...
JavaScript性能优化实战指南
JavaScript性能优化实战指南 1. 性能分析工具与指标 核心工具链 Chrome DevTools: Performance面板:记录运行时性能,分析长任务(Long Tasks)、强制回流(Layout Shifts)、函数调用堆栈。Memory面…...
宇树人形机器人开源模型
1. 下载源码 https://github.com/unitreerobotics/unitree_ros.git2. 启动Gazebo roslaunch h1_description gazebo.launch3. 仿真效果 H1 GO2 B2 Laikago Z1 4. VMware: vmw_ioctl_command error Invalid argument 这个错误通常出现在虚拟机环境中运行需要OpenGL支持的应用…...
【Linux】浅谈冯诺依曼和进程
一、冯诺依曼体系结构 冯诺依曼由 输入设备、输出设备、运算器、控制器、存储器 五部分组成。 冯诺依曼的设计特点 二进制表示 所有数据(包括程序指令)均以二进制形式存储和运算,简化了硬件逻辑设计,提高了可靠性。 存储程序原理…...
env.development.local 和 env.development 的区别
env.development.local 和 env.development 的区别 区别1、场景2、git管理3、加载策略 思考原因如下 区别 1、场景 env.development: 用于开发环境的环境变量配置env.development.local: 用于存储特定于开发者的本地配置信息 2、git管理 env.development.local 会通过*.loca…...
linux操作系统实战
第一题 创建根目录结构中的所有的普通文件 [rootlocalhost ~]# cd /[rootlocalhost /]# mkdir /text[rootlocalhost /]# cd /text[rootlocalhost text]# mkdir /text/boot /text/root /text/home /text/bin /text/sbin /text/lib /text/lib64 /text/usr /text/opt /text/etc /…...
Python Cookbook-4.1 对象拷贝
任务 想拷贝某对象。不过,当你对一个对象赋值,将其作为参数传递,或者作为结果返回时,Python 通常会使用指向原对象的引用,并不是真正的拷贝。 解决方案 Python 标准库的 copy 模块提供了两个函数来创建拷贝。第一个…...
浅谈时钟启动和Systemlnit函数
时钟是STM32的关键,是整个系统的心脏,时钟如何启动,时钟源如何选择,各个参数如何设置,我们从源码来简单分析一下时钟的启动函数Systemlnit()。 Systemlnit函数简介 我们先来看一下源程序的注释…...
事业单位ABCDE类
1 我刚刚查阅了一下安徽省市直单位报名的表,我这个专业报的岗位大多数是自然科学专技岗。 2 安徽省的岗位大多都限制计算机科学与技术,我这个0854计算机技术能报的岗位十分有限。 而且我没有看到一个岗位只招应届生,显然安徽不保护应届生的…...
Python:函数(一)
python函数相关的知识点 1. 函数定义与调用 定义:使用 def 关键字,后接函数名和参数列表。 def greet(name):"""打印问候语(文档字符串)"""print(f"Hello, {name}!") 调用:…...
MySql学习_基础Sql语句
目录 1.数据库相关概念 2.SQL 2.1 SQL通用语法 2.2 SQL分类 2.3 DDL(数据库定义语言) 2.4 DML(数据操作语言) 2.5 DQL(数据查询语言) 2.6 DCL(数据控制语言) 3. 函数 3.1 字…...
Nginx 生产环境安全配置加固
以下是Nginx生产环境安全配置加固的综合方案,结合多个技术实践和行业标准整理: 一、基础安全防护 1. 隐藏版本信息 在http或server块添加server_tokens off;,避免暴露Nginx版本号。使用headers-more-nginx-module模块彻底移除响应头…...
C#中继承的核心定义
1. 继承的核心定义 继承 是面向对象编程(OOP)的核心特性之一,允许一个类(称为子类/派生类)基于另一个类(称为父类/基类)构建,自动获得父类的成员(字段、属…...
小白学Agent技术[5](Agent框架)
文章目录 Agent框架Single Agent框架BabyAGIAutoGPTHuggingGPTHuggingGPT工作原理说明GPT-EngineerAppAgentOS-Copilot Multi-Agent框架斯坦福虚拟小镇TaskWeaverMetaGPT微软UFOAgentScope现状 常见Agent项目比较概述技术规格和能力实际应用案例开发体验比较ChatChain模式 Agen…...
21.dirsearch:Web 路径扫描工具
一、项目介绍 dirsearch 是一款高效、多线程的 Web 路径扫描工具,专为渗透测试人员和网络安全研究人员设计,用于发现目标网站的隐藏目录、敏感文件及未授权接口。其支持自定义字典、代理配置、请求头伪装等功能,适用于红队渗透、漏洞挖掘及资…...
VSTO(C#)Excel开发4:打印设置
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
设计模式Python版 模板方法模式(上)
文章目录 前言一、模板方法模式二、模板方法模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间…...
