当前位置: 首页 > news >正文

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语言射击小游戏的实现示例。这个游戏中&#xff0c;玩家控制一个飞船&#xff0c;敌方飞船会随机出现并向玩家移动。如果玩家的飞船与敌方飞船相撞&#xff0c;玩家就失去一条生命&#xff0c;代码如下&#xff1a; #include <stdio.h> #include <s…...

c++11 标准模板(STL)本地化库 - std::islower(std::locale) 检查字符是否被本地环境分类为小写

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 检查字符是否被本地环境分类为小写 std::islower(std::locale) template&…...

粘度指数改进剂市场需求增长 为润滑油添加剂细分产品

粘度指数改进剂市场需求增长 为润滑油添加剂细分产品 粘度指数改进剂是一种油溶性高分子聚合物&#xff0c;主要用于提高润滑油粘度以及粘度指数。粘度指数改进剂具有稠化能力强、抗磨性好、热稳定性好等优势&#xff0c;可添加于液压油、内燃机油以及齿轮油等油品中。 …...

LabVIEW柴油机安保监控系统

LabVIEW柴油机安保监控系统 随着航运业的快速发展&#xff0c;确保船舶柴油机的安全稳定运行变得尤为重要。船舶柴油机故障不仅会导致重大的经济损失&#xff0c;还可能危及人员安全和环境。设计并开发了一套基于LabVIEW平台的柴油机安保监控系统&#xff0c;旨在通过实时监控…...

实测国内AI大模型问答效果

随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型。按照github工程awesome-LLMs-In-China所列举的&#xff0c;现如今国内AI大模型已达243个&#xff0c;比较著名的有文心一言、通义千问等。各大应用也开始内置AI玩法&#xff0c;如抖音的AI特效。下…...

不得不等待的无奈 -《葡萄成熟时》

恋上一个人便是撒下一颗葡萄种子&#xff0c;你可能会坚持&#xff0c;但不一定会结果&#xff0c;收获&#xff08;在一起&#xff09;。 更有可能得到的是枯枝烂叶&#xff08;ta的离开&#xff09;。 就算你再努力&#xff0c;再用心去栽培&#xff08;为ta付出&#xff0…...

【Python】Python中装饰器和魔法方法的区别

在Python中&#xff0c;装饰器&#xff08;Decorators&#xff09;和魔法方法&#xff08;Magic Methods&#xff09;是两种不同的高级特性&#xff0c;分别服务于不同的目的。 装饰器 (Decorators) 装饰器是一种强大的工具&#xff0c;它可以修改或增强函数、方法或类的行为…...

【React】创建你的第一个React组件

要使用React创建你的第一个组件&#xff0c;首先确保你已经安装了Node.js和npm&#xff08;Node包管理器&#xff09;。然后&#xff0c;你可以通过npm安装Create React App这个官方支持的脚手架工具来快速生成一个新的React应用项目&#xff0c;该项目包含了React、ReactDOM、…...

五分钟搞懂MySQL索引下推

什么是索引下推 索引下推(Index Condition Pushdown&#xff0c;简称ICP)&#xff0c;是MySQL5.6版本的新特性&#xff0c;它能减少回表查询次数&#xff0c;提高查询效率。 索引下推优化的原理 我们先简单了解一下MySQL大概的架构&#xff1a; MySQL服务层负责SQL语法解析、…...

【数据库】SQL如何添加数据

在SQL中&#xff0c;您可以使用INSERT INTO语句来添加数据到数据库表中。以下是一些基本的示例和解释&#xff1a; 1.插入完整行数据&#xff1a; 如果您想为表中的每一列都插入数据&#xff0c;那么可以不必指定列名。但是&#xff0c;您需要为每一列都提供数据&#xff0c;并…...

ClickHouse01-什么是ClickHouse

什么是ClickHouse&#xff1f; 关于发展历史存在的优势与劣势什么是它风靡的原因&#xff1f; 什么是ClickHouse&#xff1f; 官方给出的回答是&#xff0c;它是一个高性能、列式存储、基于SQL、供在线分析处理的数据库管理系统 当然这边不得不提到OLAP(Online Analytical Pr…...

使用Docker搭建Nascab

使用Docker来部署Nascab能够让这个过程变得更加灵活和便捷&#xff0c;因为Docker可以在隔离的环境中运行应用程序&#xff0c;简化了部署和配置的复杂性。 使用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 如何并发修改

前言 并发控制&#xff0c;一般有两种方案&#xff0c;悲观锁和乐观锁&#xff0c;其中悲观锁是默认每次更新操作肯定会冲突&#xff0c;所以每次操作都要先获取锁&#xff0c;操作完毕再释放锁&#xff0c;适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&#…...

Docker 安装 Skywalking以及UI界面

关于Skywalking 在现代分布式系统架构中&#xff0c;应用性能监控&#xff08;Application Performance Monitoring, APM&#xff09;扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking&#xff0c;通过对其功能特性和工作原理的详细介绍&am…...

mysql 空间查询 多边形内的点

数据库查询 # 1新增空间point类型坐标字段 ALTER TABLE gaoxin_isdp.business_master ADD COLUMN location2 point NULL AFTER location;# 2从原字段更新点位字段&#xff0c;原字段poi1是字符串106.474596,29.464360 UPDATE business_master SET location POINT(substr(poi…...

实际开发中,git版本切换操作

业务场景 客户环境需要部署当前分支的之前的一个版本代码&#xff0c;所以需要从当前的commit切换到之前的commit 版本切换步骤 查看版本提交日志 $ git reflog切换版本 git reset --hard 七位数的版本id在切换后的版本上更改代码后 执行完暂存 git commit 把回退后的代码提…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...