SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)
返回:SQLite—系列文章目录
上一篇:SQLiteC/C++接口详细介绍sqlite3_stmt类(十二)
下一篇: 待续

51、sqlite3_stmt_scanstatus_reset
sqlite3_stmt_scanstatus_reset 函数用于重置指定语句对象最近一次执行的 WHERE 子句中搜索的行数及扫描的页数的数据,以便进行下一次查询。
函数原型如下:
void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt);
参数说明:
- pStmt:已经编译的 SQLite 语句对象。
该函数没有返回值。
举例用法:
int nLoop = 0;
int nVisit = 0;
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "SELECT * FROM user WHERE age > ?", -1, &stmt, NULL);
sqlite3_bind_int(stmt, 1, 18);
while (sqlite3_step(stmt) == SQLITE_ROW) {nLoop++;
}
sqlite3_stmt_scanstatus_reset(stmt); // 重置搜索的行数和扫描的页数
while (sqlite3_step(stmt) == SQLITE_ROW) {nLoop++;
}
sqlite3_stmt_scanstatus(stmt, SQLITE_SCANSTAT_NLOOP, 0, &nLoop);
sqlite3_stmt_scanstatus(stmt, SQLITE_SCANSTAT_NVISIT, 0, &nVisit);
printf("搜索了 %d 行,扫描了 %d 个页\n", nLoop, nVisit);
sqlite3_finalize(stmt);
在上面的示例中,我们使用 `sqlite3_prepare_v2` 函数编译了一条 SQL 语句,并绑定了一个参数。然后使用 `sqlite3_step` 函数逐行获取查询结果,并累计 WHERE 子句搜索的行数和扫描的页数。在第一个 `while` 循环后使用 `sqlite3_stmt_scanstatus_reset` 函数,以清空搜索的行数和扫描的页数的数据。然后在第二个 `while` 循环中执行查询,再使用 `sqlite3_stmt_scanstatus` 函数获取搜索的行数和扫描的页数,并将结果打印出来。
使用这个函数可以用于评估不同查询条件下的查询效率和性能,对 SQL 语句进行调优和优化。
52、sqlite3_stmt_scanstatus_v2
sqlite3_stmt_scanstatus_v2 函数用于返回指定的语句对象最近一次执行的 WHERE 子句中搜索的行数及扫描的页数。相对于 sqlite3_stmt_scanstatus 函数,它能额外生成一些查询性能的统计信息。
函数原型如下:
int sqlite3_stmt_scanstatus_v2(sqlite3_stmt* pStmt, /* Prepared statement to be measured */int idx, /* Index of binding to report on */int iScanStatusOp, /* Operation to measure */void* pOut, /* OUT: Write statistic here */int resetFlg /* Reset value for pOut */
);
参数说明:
- pStmt:已经编译的 SQLite 语句对象。
- idx:指定绑定参数的索引(从 1 开始),如果不需要指定则使用 0。
- iScanStatusOp:操作类型,可以是下列值中的一种:
- `SQLITE_SCANSTAT_NLOOP`:返回 WHERE 子句搜索的行数。
- `SQLITE_SCANSTAT_NVISIT`:返回 WHERE 子句扫描的页数。
- `SQLITE_SCANSTAT_EST`:返回 WHERE 子句搜索的平均行数。
- `SQLITE_SCANSTAT_SELECTID`:返回 SELECT 查询的 ID。
- `SQLITE_SCANSTAT_EXPLAIN`:返回执行计划的文本形式。
- `SQLITE_SCANSTAT_ALL`:同时返回上述所有统计信息。
- pOut:返回查询结果的指针。
- resetFlg:是否重置累计统计数据,1 表示重置,0 表示不重置。
返回值:
- 返回 `SQLITE_OK` 表示执行成功,否则返回其他错误码。
各种操作的返回结果的数据类型与 sqlite3_stmt_scanstatus 函数一致,其中 `SQLITE_SCANSTAT_EXPLAIN` 的返回类型为 `const char *`。
举例用法:
int nLoop = 0;
int nVisit = 0;
const char *explain = NULL;
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "SELECT * FROM user WHERE age > ?", -1, &stmt, 0);
sqlite3_bind_int(stmt, 1, 18);
while (sqlite3_step(stmt) == SQLITE_ROW) {nLoop++;
}
sqlite3_stmt_scanstatus_v2(stmt, 0, SQLITE_SCANSTAT_NLOOP, &nLoop, 1);
sqlite3_stmt_scanstatus_v2(stmt, 0, SQLITE_SCANSTAT_NVISIT, &nVisit, 1);
sqlite3_stmt_scanstatus_v2(stmt, 0, SQLITE_SCANSTAT_EXPLAIN, &explain, 0);
printf("搜索了 %d 行,扫描了 %d 个页\n", nLoop, nVisit);
printf("执行计划:\n%s\n", explain);
sqlite3_finalize(stmt);
在上面的示例中,我们使用 `sqlite3_prepare_v2` 函数编译了一条 SQL 语句,并绑定了一个参数。然后使用 `sqlite3_step` 函数逐行获取查询结果,并累加 WHERE 子句搜索的行数。最后使用 `sqlite3_stmt_scanstatus_v2` 函数获取搜索的行数、扫描的页数和执行计划,并将结果打印出来。
需要注意的是,在获取 SQL 语句执行计划信息时,需要使用 `SQLITE_SCANSTAT_EXPLAIN` 操作,并将 resetFlg 参数设为 0,以保留已有的执行计划信息,否则需要先调用 sqlite3_clear_bindings 函数来释放绑定参数。
53、sqlite3_stmt_status
sqlite3_stmt_status 函数用于返回指定语句对象的执行状态信息,如 SQL 语句执行的次数、查询返回的行数、最后使用的表和索引、插入、修改和删除的行数等。
函数原型如下:
int sqlite3_stmt_status(sqlite3_stmt *pStmt, /* Prepared statement to be queried */int op, /* Information desired */int resetFlg, /* Reset the value after returning it if true */int *pOut /* Integer value to return */
);
参数说明:
- pStmt:已经编译的 SQLite 语句对象。
- op:所需字段的操作代码,可以是下列值中的一种:
- `SQLITE_STMTSTATUS_FULLSCAN_STEP`:执行全表扫描的步骤数。
- `SQLITE_STMTSTATUS_SORT`:排序操作的总数。
- `SQLITE_STMTSTATUS_AUTOINDEX`:Autoindex 步骤数。
- `SQLITE_STMTSTATUS_VM_STEP`:后续操作已执行完成的虚拟机步骤数。
- `SQLITE_STMTSTATUS_REPREPARE`:SQL 语句重新编译的次数。
- `SQLITE_STMTSTATUS_RUN`:语句已执行的次数。
- `SQLITE_STMTSTATUS_MEMUSED`:语句消耗的内存总量(单位字节)。
- `SQLITE_STMTSTATUS_ROW`:已返回的行数。
- `SQLITE_STMTSTATUS_STMT_USED`:语句对象使用的内存总量(单位字节)。
- `SQLITE_STMTSTATUS_STMTEXPIRED`:处于过期状态的预处理语句的数量。
- resetFlg:是否重置所需字段的值,1 表示重置,0 表示不重置。
- pOut:返回查询结果的指针。
返回值:
- 返回 `SQLITE_OK` 表示执行成功,否则返回其他错误码。
举例用法:
int nRow = 0;
int memUsed = 0;
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "SELECT * FROM user WHERE age > ?", -1, &stmt, NULL);
sqlite3_bind_int(stmt, 1, 18);
while (sqlite3_step(stmt) == SQLITE_ROW) {nRow++;
}
sqlite3_stmt_status(stmt, SQLITE_STMTSTATUS_MEMUSED, 1, &memUsed);
printf("执行了 %d 次查询,返回了 %d 行,消耗了 %d 字节的内存\n", sqlite3_stmt_status(stmt, SQLITE_STMTSTATUS_RUN, 0, NULL), nRow, memUsed);
sqlite3_finalize(stmt);
在上面的示例中,我们使用 `sqlite3_prepare_v2` 函数编译了一条 SQL 语句,并绑定了一个参数。然后使用 `sqlite3_step` 函数逐行获取查询结果,并累加已返回的行数。使用 `sqlite3_stmt_status` 函数获取语句对象的执行次数和消耗的内存量,并将结果打印出来。
使用这个函数可以用于监控 SQL 查询的性能表现,以实现 SQL 语句调优。
后记:
本次Stmt类的所有内容已经完成后续内容等待更新要三互的请发消息。
相关文章:
SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)
返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(十二) 下一篇: 待续 51、sqlite3_stmt_scanstatus_reset sqlite3_stmt_scanstatus_reset 函数用于重置指定语句对象最近一次执行的 WHER…...
扫雷(蓝桥杯,acwing)
题目描述: 扫雷是一种计算机游戏,在 2020 世纪 80 年代开始流行,并且仍然包含在某些版本的 Microsoft Windows 操作系统中。 在这个问题中,你正在一个矩形网格上玩扫雷游戏。 最初网格内的所有单元格都呈未打开状态。 其中 M个…...
macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
如果你通过 sudo port install 命令正常安装了 MySQL,再通过 sudo port load 命令启动了 MySQL Server,此刻却发现使用 Navicat 之类的 GUI 软件无法连接,始终返回无法连接到 127.0.0.1 服务器。这是一个小坑,因为他默认使用了 So…...
Semi-supervised Open-World Object Detection
Semi-supervised Open-World Object Detection 摘要1 介绍2.准备工作提出的SS-OWOD问题设置2.1 基础架构3 方法3.1整体架构摘要 传统的开放世界对象检测(OWOD)问题设置首先区分已知和未知类别,然后在后续任务中引入标签时逐步学习未知对象。然而,当前的OWOD公式在增量学习…...
C语言实现射击小游戏
以下是一个简单的C语言射击小游戏的实现示例。这个游戏中,玩家控制一个飞船,敌方飞船会随机出现并向玩家移动。如果玩家的飞船与敌方飞船相撞,玩家就失去一条生命,代码如下: #include <stdio.h> #include <s…...
c++11 标准模板(STL)本地化库 - std::islower(std::locale) 检查字符是否被本地环境分类为小写
本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 检查字符是否被本地环境分类为小写 std::islower(std::locale) template&…...
粘度指数改进剂市场需求增长 为润滑油添加剂细分产品
粘度指数改进剂市场需求增长 为润滑油添加剂细分产品 粘度指数改进剂是一种油溶性高分子聚合物,主要用于提高润滑油粘度以及粘度指数。粘度指数改进剂具有稠化能力强、抗磨性好、热稳定性好等优势,可添加于液压油、内燃机油以及齿轮油等油品中。 …...
LabVIEW柴油机安保监控系统
LabVIEW柴油机安保监控系统 随着航运业的快速发展,确保船舶柴油机的安全稳定运行变得尤为重要。船舶柴油机故障不仅会导致重大的经济损失,还可能危及人员安全和环境。设计并开发了一套基于LabVIEW平台的柴油机安保监控系统,旨在通过实时监控…...
实测国内AI大模型问答效果
随着ChatGPT热度的攀升,越来越多的公司也相继推出了自己的AI大模型。按照github工程awesome-LLMs-In-China所列举的,现如今国内AI大模型已达243个,比较著名的有文心一言、通义千问等。各大应用也开始内置AI玩法,如抖音的AI特效。下…...
不得不等待的无奈 -《葡萄成熟时》
恋上一个人便是撒下一颗葡萄种子,你可能会坚持,但不一定会结果,收获(在一起)。 更有可能得到的是枯枝烂叶(ta的离开)。 就算你再努力,再用心去栽培(为ta付出࿰…...
【Python】Python中装饰器和魔法方法的区别
在Python中,装饰器(Decorators)和魔法方法(Magic Methods)是两种不同的高级特性,分别服务于不同的目的。 装饰器 (Decorators) 装饰器是一种强大的工具,它可以修改或增强函数、方法或类的行为…...
【React】创建你的第一个React组件
要使用React创建你的第一个组件,首先确保你已经安装了Node.js和npm(Node包管理器)。然后,你可以通过npm安装Create React App这个官方支持的脚手架工具来快速生成一个新的React应用项目,该项目包含了React、ReactDOM、…...
五分钟搞懂MySQL索引下推
什么是索引下推 索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。 索引下推优化的原理 我们先简单了解一下MySQL大概的架构: MySQL服务层负责SQL语法解析、…...
【数据库】SQL如何添加数据
在SQL中,您可以使用INSERT INTO语句来添加数据到数据库表中。以下是一些基本的示例和解释: 1.插入完整行数据: 如果您想为表中的每一列都插入数据,那么可以不必指定列名。但是,您需要为每一列都提供数据,并…...
ClickHouse01-什么是ClickHouse
什么是ClickHouse? 关于发展历史存在的优势与劣势什么是它风靡的原因? 什么是ClickHouse? 官方给出的回答是,它是一个高性能、列式存储、基于SQL、供在线分析处理的数据库管理系统 当然这边不得不提到OLAP(Online Analytical Pr…...
使用Docker搭建Nascab
使用Docker来部署Nascab能够让这个过程变得更加灵活和便捷,因为Docker可以在隔离的环境中运行应用程序,简化了部署和配置的复杂性。 使用Docker CLI部署Nascab docker run -d \ --name nascab \ -p 18080:80 \ -p 18443:443 \ -p 18090:90 \ -p 18021:…...
Elasticsearch8.x版本Java客户端Elasticsearch Java API 如何并发修改
前言 并发控制,一般有两种方案,悲观锁和乐观锁,其中悲观锁是默认每次更新操作肯定会冲突,所以每次操作都要先获取锁,操作完毕再释放锁,适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&#…...
Docker 安装 Skywalking以及UI界面
关于Skywalking 在现代分布式系统架构中,应用性能监控(Application Performance Monitoring, APM)扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking,通过对其功能特性和工作原理的详细介绍&am…...
mysql 空间查询 多边形内的点
数据库查询 # 1新增空间point类型坐标字段 ALTER TABLE gaoxin_isdp.business_master ADD COLUMN location2 point NULL AFTER location;# 2从原字段更新点位字段,原字段poi1是字符串106.474596,29.464360 UPDATE business_master SET location POINT(substr(poi…...
实际开发中,git版本切换操作
业务场景 客户环境需要部署当前分支的之前的一个版本代码,所以需要从当前的commit切换到之前的commit 版本切换步骤 查看版本提交日志 $ git reflog切换版本 git reset --hard 七位数的版本id在切换后的版本上更改代码后 执行完暂存 git commit 把回退后的代码提…...
JetBrains 推出全新开发工具:AI IDE AIR,太炸裂!
当“AI 辅助编程”不再只是一个附加功能,而成为 IDE 的底层架构逻辑,开发工具会进化成什么样?JetBrains 的答案是:不是把 AI 塞进 IDE,而是用 AI 重构 IDE 本身 —— 这就是 AIR(AI IDE from JetBrains&…...
MPL3115A2气压高度传感器嵌入式驱动开发与FreeRTOS集成
1. MPL3115A2气压高度传感器技术解析与嵌入式驱动开发实践1.1 器件定位与工程价值MPL3115A2是NXP(原Freescale)推出的高精度数字气压/高度/温度传感器,采用IC接口,工作电压范围为1.95V–3.6V,典型功耗仅7μA࿰…...
别再被照片骗了!从手机到单反,5分钟搞懂镜头畸变(附常见场景对比图)
别再被照片骗了!从手机到单反,5分钟搞懂镜头畸变(附常见场景对比图) 每次拍完照片回看时,总觉得哪里不对劲——明明站得笔直的闺蜜在画面边缘变成了"香蕉人",精心构图的城市天际线像被哈哈镜扭曲…...
Go-依赖管理实战:从go.sum到GOSUMDB的深度解析
1. go.sum文件:Go依赖的"身份证"系统 第一次接触Go项目时,你可能注意过一个叫go.sum的文件。这个看似简单的文本文件,实际上是Go模块依赖管理的核心安全机制。想象一下,当你从网上下载一个软件包,如何确认下…...
【51 单片机入门到进阶】10 入门:51单片机模块化编程
一,什么是模块化设计 把一个大程序,按功能拆成一个个独立的小文件、小函数,分开写、分开管理。 例如: led.c / led.h → 负责 LEDkey.c / key.h → 负责按键uart.c / uart.h → 负责串口hc_sr04.c / hc_sr04.c → 负责超声波main.…...
云原生成本优化策略与实践
云原生成本优化策略与实践 1. 云原生环境中的成本挑战 在云原生架构普及的今天,如何有效控制和优化云成本成为企业面临的重要挑战。云原生应用通常采用微服务架构,使用容器、Kubernetes 等技术,虽然带来了灵活性和可扩展性,但也使…...
从数学原理到Python实现:最小公倍数算法的前世今生
从数学原理到Python实现:最小公倍数算法的前世今生 在数字的海洋中,两个看似毫不相关的整数之间,往往隐藏着精妙的数学联系。最小公倍数(LCM)作为连接这些数字的桥梁,不仅在现代编程中扮演着重要角色&#…...
从“人找需求”到“需求找人”:聊聊CoCode AI如何让软件设计文档自己“长”出来
从“人找需求”到“需求找人”:AI如何重构软件设计工作流 在传统软件工程中,设计文档的编写往往被视为开发前的"必要之恶"——团队需要花费数周甚至数月时间,将模糊的需求转化为数百页的概要设计和详细设计文档。这种"瀑布式&…...
VidCoder:解决视频转码与苹果设备兼容问题的免费工具
你是否遇到过这样的情况:下载的电影是MKV格式,想在iPhone或iPad上播放,却发现无法导入;从网上下载的视频太大,想压缩后发送给朋友,却找不到合适的工具;或者你有一张DVD光盘,想把里面…...
次元画室Keil5嵌入式开发趣味应用:为代码生成项目标识图
次元画室Keil5嵌入式开发趣味应用:为代码生成项目标识图 每次新建一个STM32项目,是不是总觉得少了点什么?项目文件夹里,除了那些.c、.h文件和工程配置,总感觉冷冰冰的,缺乏一点个性。README文档也是干巴巴…...
