Sqlite真空命令VACUUM

之前在项目中使用了sqlite数据库,当日志变大时,执行CRUD操作就会变慢

后来尝试删除7天前的记录进行优化

delete from XX_CollectData where CreateTime<='2024-01-24'

发现sqlite文件的大小就没有变化,delete命令只是逻辑删除,所在的文件的字节码仍然还在,优化效果仍不明显。

后来使用真空命令VACUUM,发现文件大小确实变小了。

VACUUM

SQLite Vacuum

VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件。这消除了空闲页,把表中的数据排列为连续的,另外会清理数据库文件结构。

如果表中没有明确的整型主键(INTEGER PRIMARY KEY),VACUUM 命令可能会改变表中条目的行 ID(ROWID)。VACUUM 命令只适用于主数据库,附加的数据库文件是不可能使用 VACUUM 命令。

如果有一个活动的事务,VACUUM 命令就会失败。VACUUM 命令是一个用于内存数据库的任何操作。由于 VACUUM 命令从头开始重新创建数据库文件,所以 VACUUM 也可以用于修改许多数据库特定的配置参数。

相关测试程序类【C#代码】

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Linq;
using System.Text;namespace SnakeSqliteDemo
{/// <summary>/// 作者:斯内科/// 时间:2024-01-24/// 功能:sqlite数据库操作类/// </summary>public class SqliteDbHelper{/// <summary>/// 连接字符串/// </summary>private string m_strConnectString = string.Empty;/// <summary> /// 构造函数 /// </summary> /// <param name="strDbPath">SQLite数据库文件路径</param> public SqliteDbHelper(string strDbPath){this.m_strConnectString = "Data Source=" + strDbPath;}/// <summary> /// 创建SQLite数据库文件 /// </summary> /// <param name="strDbPath">要创建的SQLite数据库文件路径</param> /// <param name="strdbTableCreateString">要创建的SQLite数据库表格</param> public static void CreateDB(string strDbPath, string strdbTableCreateString){using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + strDbPath)){connection.Open();using (SQLiteCommand command = new SQLiteCommand(connection)){command.CommandText = strdbTableCreateString;command.ExecuteNonQuery();}}}/// <summary> /// 对SQLite数据库执行增删改操作,返回受影响的行数。 /// </summary> /// <param name="strSql">要执行的增删改的SQL语句</param> /// <param name="parameters">执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> /// <returns>返回受影响的行数</returns> public int ExecuteNonQuery(string strSql, SQLiteParameter[] parameters, bool IsDelete = false){try{int intAffectedRows = 0;using (SQLiteConnection connection = new SQLiteConnection(m_strConnectString)){connection.Open();using (DbTransaction transaction = connection.BeginTransaction()){using (SQLiteCommand command = new SQLiteCommand(connection)){command.CommandText = strSql;if (parameters != null){command.Parameters.AddRange(parameters);}intAffectedRows = command.ExecuteNonQuery();}transaction.Commit();if (IsDelete){//sqlite 真空命令,文件压缩:VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件。//这消除了空闲页,把表中的数据排列为连续的,另外会清理数据库文件结构。using (SQLiteCommand command = new SQLiteCommand(connection)){command.CommandText = "VACUUM";command.ExecuteNonQuery();}}}}return intAffectedRows;}catch(Exception ex){Console.WriteLine("执行sql语句异常," +ex.Message + "\r\n详细sql语句为:" + strSql);return -1;}}public int ExecuteNonQueryByDic(string strSql, Dictionary<string, object> dicParams){try{int intAffectedRows = 0;using (SQLiteConnection connection = new SQLiteConnection(m_strConnectString)){connection.Open();using (DbTransaction transaction = connection.BeginTransaction()){using (SQLiteCommand command = new SQLiteCommand(connection)){command.CommandText = strSql;if (dicParams != null && dicParams.Count > 0){command.Parameters.Clear();foreach (string parameterName in dicParams.Keys){command.Parameters.AddWithValue(parameterName, dicParams[parameterName]);}}intAffectedRows = command.ExecuteNonQuery();}transaction.Commit();}}return intAffectedRows;}catch(Exception ex){Console.WriteLine("执行sql语句异常," + ex.Message + "\r\n详细sql语句为:" + strSql);return -1;}}/// <summary> /// 执行一个查询语句,返回一个关联的SQLiteDataReader实例 /// </summary> /// <param name="strSql">要执行的查询语句</param> /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> /// <returns>返回SQLiteDataReader</returns> public SQLiteDataReader ExecuteReader(string strSql, SQLiteParameter[] parameters){SQLiteConnection connection = new SQLiteConnection(m_strConnectString);SQLiteCommand command = new SQLiteCommand(strSql, connection);if (parameters != null){command.Parameters.AddRange(parameters);}connection.Open();return command.ExecuteReader(CommandBehavior.CloseConnection);}/// <summary> /// 执行一个查询语句,返回一个包含查询结果的DataTable /// </summary> /// <param name="strSql">要执行的查询语句</param> /// <param name="parameters">执行SQL查询语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> /// <returns>返回数据表</returns> public DataTable ExecuteDataTable(string strSql, SQLiteParameter[] parameters){using (SQLiteConnection connection = new SQLiteConnection(m_strConnectString)){                using (SQLiteCommand command = new SQLiteCommand(strSql, connection)){if (parameters != null){command.Parameters.AddRange(parameters);}SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);DataTable data = new DataTable();adapter.Fill(data);return data;}}}public DataTable GetDataTable(string strSql, Dictionary<string, object> dicParams){using (SQLiteConnection connection = new SQLiteConnection(m_strConnectString)){using (SQLiteCommand command = new SQLiteCommand(strSql, connection)){if (dicParams != null && dicParams.Count > 0){command.Parameters.Clear();foreach (string parameterName in dicParams.Keys){command.Parameters.AddWithValue(parameterName, dicParams[parameterName]);}}SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);DataTable data = new DataTable();adapter.Fill(data);return data;}}}public DataSet ExcuteDataSet(string strSql){DataSet ds = new DataSet("MyDataSet");using (SQLiteConnection connection = new SQLiteConnection(m_strConnectString)){using (SQLiteCommand command = new SQLiteCommand(strSql, connection)){                    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);adapter.Fill(ds);return ds;}}           }/// <summary> /// 执行一个查询语句,返回查询结果的第一行第一列 /// </summary> /// <param name="strSql">要执行的查询语句</param> /// <returns>返回第一行第一列的值</returns> public object ExecuteScalar(string strSql){try{using (SQLiteConnection connection = new SQLiteConnection(m_strConnectString)){connection.Open();using (SQLiteCommand command = new SQLiteCommand(strSql, connection)){return command.ExecuteScalar(); }}}catch{throw;}}public int ExecuteScalarInt(string strSql){object oRes = ExecuteScalar(strSql);return oRes == null ? 0 : Convert.ToInt32(oRes);}/// <summary> /// 查询数据库中的所有数据类型信息 /// </summary> /// <returns>返回数据表</returns> public DataTable GetSchema(){using (SQLiteConnection connection = new SQLiteConnection(m_strConnectString)){connection.Open();DataTable data = connection.GetSchema("TABLES");connection.Close();return data;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BPM、低代码和人工智能:实现灵活、创新与转型的关键结合

随着零售业格局的不断演变&#xff0c;零售商正被迫在一个日益活跃、竞争日益激烈的客户驱动型市场中展开竞争。随着互联网上产品信息和评论的出现&#xff0c;消费者的态度发生了巨大的变化——购物者不再依赖销售人员来获取信息。他们现在知道的和许多零售销售人员一样多&…

Element-Plus如何实现表单校验和表单重置

一&#xff1a;页面布局介绍&#xff1a; 这是我刚刚用基于vue3element-plus写好的一个部门管理的页面 基本的增删改查已经写好&#xff0c;下面我只提供页面的template和style的代码&#xff1a; template <template><el-card class"box-card"><…

openGauss学习笔记-207 openGauss 数据库运维-常见故障定位案例-btree 索引故障情况下应对策略

文章目录 openGauss学习笔记-207 openGauss 数据库运维-常见故障定位案例-btree 索引故障情况下应对策略207.1 btree 索引故障情况下应对策略207.1.1 问题现象207.1.2 原因分析207.1.3 处理办法 openGauss学习笔记-207 openGauss 数据库运维-常见故障定位案例-btree 索引故障情…

洛谷P5735 【深基7.例1】距离函数(C语言)

首先&#xff0c;三角形周长为 其次(x1,x2)和 &#xff08;y1,y2&#xff09;的距离 然后就可以为所欲为 #include <stdio.h> #include <math.h>double distance(double a1, double b1, double a2, double b2) {return sqrt((a1 - a2) * (a1 - a2) (b1 - b2) * …

【跳槽面试】Redis的过期键删除策略?

前言 key的生存时间到了&#xff0c;Redis会立即删除吗&#xff1f;不会立即删除。 过期策略 • 定时删除&#xff1a;在设置key的过期时间的同时&#xff0c;为该key创建一个定时器&#xff0c;让定时器在key的过期时间来临时&#xff0c;对key进行删除 • 定期删除&#xff…

简单模拟实现一个线程池

废话不多说之间上代码 import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue;public class MyThreadPoolExecutor {private List<Thread> listnew ArrayList<>();pri…

qemu使用

百度qemu bios 失败 问题 坑爹的玩意&#xff0c;编译qemu 还需要python3.5以上 解决方法&#xff1a; CentOS7安装Python3.8-CSDN博客 https://www.cnblogs.com/Oliver.net/p/7211967.html 编译python3.8还由于openssl过低 成功启动qemu 先阅读官网 Download QEMU …

【Linux】Ubuntu的gnome切换KDE Plasma

文章目录 安装KDE Plasma桌面环境添加软件源并更新apt安装kubuntu-desktop&#xff08;作者没有成功&#xff09;aptitude安装kubuntu-desktop多次aptitude install&#xff08;特别重要特别重要&#xff09;其他kde软件包 卸载gnome桌面 Ubuntu自带的桌面环境是gnome&#xff…

基于云原生技术栈构建企业统一基础技术平台(总纲)

一、概述 本文主要介绍基于云原生技术栈建设企业技术平台的总纲&#xff0c;该技术平台对业务应用全生命周期进行管理和支撑&#xff0c;提供从需求交付、生产运行、稳定保障、资产运营&#xff0c;以及安全生产的体系化解决方案&#xff0c;为企业自建或采购技术平台提供参考。…

【嵌入式学习】C++QT-Day2-C++基础

笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度…

C++ 数论相关题目(欧拉函数、筛法求欧拉函数)

1、欧拉函数 给定 n 个正整数 ai &#xff0c;请你求出每个数的欧拉函数。 欧拉函数的定义 1∼N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为 ϕ(N) 。 若在算数基本定理中&#xff0c;Npa11pa22…pamm &#xff0c;则&#xff1a; ϕ(N) Np1−1p1p2−1p2…pm−1p…

Salesforce Lightning 的 Close Case 按钮无法批量关闭 Case 的原因和解决方法

为 Lightning 页面添加了自定义的 Close Case 按钮&#xff08;方法可参考&#xff1a;https://www.simplysfdc.com/2021/01/salesforce-mass-close-case.html&#xff09;后&#xff0c;可能会出现无法批量关闭 Case 的情况。 选中多个 Case&#xff0c;再点击 Close Case 按…

基于Springboot的影城管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的影城管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

JAVA笔记16--线程

进程 进程是处于运行过程中的程序&#xff0c;具有独立的功能&#xff0c;是系统进行资源分配和调度的独立单位。 独立性 进程是系统重独立存在的实体&#xff0c;它拥有自己独立的资源&#xff0c;每个进程都拥有自己私有的地址空间&#xff0c;在没有经过进程本身允许的情…

leetcode1237. 找出给定方程的正整数解

1237. 找出给定方程的正整数解https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/ 难度中等 101 给你一个函数 f(x, y) 和一个目标结果 z&#xff0c;函数公式未知&#xff0c;请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满…

在线教育系统源码深度剖析:从零开始开发一款企业培训APP

下文&#xff0c;笔者将与大家一起深入研究在线教育系统源码&#xff0c;同时探究从零开始开发一款面向企业培训的APP所涉及的关键技术和流程。 一、背景介绍 企业培训是组织内部不可或缺的一环&#xff0c;而在线教育系统通过数字化手段&#xff0c;使培训更加灵活、个性化。…

访问网站时IP被阻止?5个解决方法

相信很多人遇到过IP禁令&#xff1a;比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问&#xff0c;又或者你的的账号莫名被封&#xff0c;这些由于网络上的种种限制我们经常会遭遇IP被封的情况&#xff0c;导致无法使用继续进行网络行动。在本文中&#xff0c;我们…

红帽认证有啥用?初级红帽认证证书值得考吗?

大家好&#xff0c;这里是G-LAB IT实验室。 今天我们来了解一下Linux红帽认证。 红帽认证已成为企业和个人竞相追逐的热门资质。 红帽认证认可度究竟如何?红帽RHCSA认证含金量又有多高? 下面G-LAB将为你一一解答。 1 、红帽认证认可度怎么样&#xff1f; 事实上&#xff0…

钉钉互动卡片对接-普通互动卡片接入流程

这里写目录标题 一、创建内部应用二、搭建普通卡片模板三、调用互动卡片服务端接口接口报文一、发送卡片二、更新卡片三、获取token 一、创建内部应用 登录开发者后台&#xff0c;创建内部应用。 例如 百度-内部测试获取AppKey和AppSecret&#xff0c; 获取应用访问凭证获取企…

cmd_to_robot 讨论及 G29 控制优化

cmd_to_robot 讨论及 G29 控制优化 cmd_to_robot 讨论 转向电机控制代码中&#xff0c;补偿信息在循环中发布&#xff0c;转向完成信息在回调函数中发布 转动电机控制代码中&#xff0c;对转动电机的控制在转向完成的回调函数中实现 这就意味着如果一直没有 /cmd_vel 消息发…