SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)

news2024/9/30 3:30:20

  返回: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类的所有内容已经完成后续内容等待更新要三互的请发消息。

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

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

相关文章

基于python+vue的OA公文发文管理系统flask-django-php-nodejs

系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对OA公文发文管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

大模型分布式推理ray

一、目录 1 框架 2. 入门 3. 安装教程 4. 相关文档、案例阅读 二、实现 1 框架:Ray:将一个模型拆分到多个显卡中,实现分布式预测、训练等功能。 2. 入门 : 案例:通过ray 实现分布式部署,分布式推理服务。…

【ReactJS】使用GoJS实现自己的图表App

目录 1:用于绘制自定义图表的JavaScript库:用于绘制UML(或BPMN或ERD …)图表的JavaScript库:2:为什么选择GoJS?3:让我们使用现有的React应用程序:步骤1:步骤2:步骤3:步骤4:推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战1:…

Kubernetes自动化配置部署

在新建工程中,使用k8s的devops服务,自动化部署项目 1、在搭建好k8s的集群中,确认已开启devops服务; 2、新建Maven项目之后,创建dockerfile、deploy和Jenkins文件 例如: Dockerfile FROM bairong.k8s.m…

数据仓库的数据处理架构Lambda和Kappa

1.数据仓库 数据仓库(Data Warehouse),简写DW。顾名思义,数据仓库是一个很大的数据存储集合,为企业分析性报告和决策支持而创建,是对多元业务数据的筛选与整合,具备一定的BI能力,主要用于企业的数据分析、数据挖掘、数据报表等方向,指导业务流程改进、监视时间、成本、…

斯坦福大学研究团队革新电机技术,助力机器人性能飞跃提升

文 | BFT机器人 在科技日新月异的今天,我们期望机器能够胜任的任务愈发复杂且多变。无论是为失去肢体的人提供动力的假肢,还是那些独立在外部世界自由穿梭的机器人,它们都需要在多种场景下展现出卓越的行动能力。 然而传统的标准电动机&…

【Java基础】了解Java安全体系JCA,使用BouncyCastle的ED25519算法生成密钥对、数据签名

文章目录 一.Java安全体系结构二.JCA和JCE三.CSP(加密服务提供程序)与Engine类1.CSP2.Engine类如何使用引擎类 四.查看当前JDK支持的算法服务提供商(Provider)五.BouncyCastle是什么六.如何使用BouncyCastle?七.bouncycastle实现ED25519工具类 一.Java安全体系结构 …

DeepLabv1网路介绍

模型创新点 在论文引言中,作者提出了目前语义分割存在的问题,并且给出了解决办法: 下采样会导致我们图像空间分辨率降低——解决办法 使用膨胀卷积 目前语义分割网络基本都是采用CNN网络作为主干网络,但是CNN网络主要适用于目标检…

获取淘宝商品评论的爬虫技术分享(已封装API,可测试)

item_review-获得淘宝商品评论 公共参数 请求地址: taobao/item_review 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,it…

鸿蒙Harmony应用开发—ArkTS-@Provide装饰器和@Consume装饰器:与后代组件双向同步

Provide和Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,Provide和Consume摆脱参数传递机制的束缚,实现跨层级传递。 其中Provide装饰的变…

基于python+vue文学名著分享系统的设计与实现flask-django-nodejs-php

随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理存在工作效率…

设计模式之单例模式解析

单例模式 1)动机 对于软件系统的某些类,无须创建多个实例,如 Windows 系统的任务管理器,重复对象会浪费系统资源。 2)概述 1.定义 确保某个类只有一个实例,而且自行实例化,并向整个系统提供…

Android Kotlin(六)协程的并发问题

书接上回:Android Kotlin知识汇总(三)Kotlin 协程 协程的并发问题 在一个协程中,循环创建10个子协程且单独运行各自Default线程中,并让每个子协程对变量 i 进行1000次自增操作。示例如下: fun main() …

Jupyter服务器端为R语言安装readr包

1.登录debian服务器 方式1.Windows10中可利用putty登录linux服务器 方式2.自从搭建了Jupyter服务器后,还可以从juypyter的终端来登录linux服务器 2.进入R语言命令行 3.安装readr包 >install.packages(‘readr’) …

使用CSS3画出一个叮当猫HTML源码

我们经常使用PS或者Flash制作动画&#xff0c;本文则介绍了如何用CSS3画出个叮当猫&#xff0c;实现过程很有趣&#xff0c;感兴趣的朋友可以参考一下 首先&#xff0c;先把HTML结构搭建好&#xff1a; <div class"wrapper"> <!--叮当猫整体--> <di…

DP动态规划入门(数字三角形、破损的楼梯、安全序列)

一、动态规划&#xff08;DP&#xff09;简介 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是运筹学的一个分支&#xff0c;它是一种通过将复杂问题分解成多个重叠的子问题&#xff0c;并通过子问题的解来构建整个问题的解的算法。在动态规划中&am…

2016年认证杯SPSSPRO杯数学建模D题(第一阶段)NBA是否有必要设立四分线解题全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 D题 NBA是否有必要设立四分线 原题再现 NBA 联盟从 1946 年成立到今天&#xff0c;一路上经历过无数次规则上的变迁。有顺应民意、皆大欢喜的&#xff0c;比如 1973 年在技术统计中增加了抢断和盖帽数据&#xff1b;有应运而生、力挽狂澜的&am…

.NET Core 服务实现监控可观测性最佳实践

前言 本次实践主要是介绍 .Net Core 服务通过无侵入的方式接入观测云进行全面的可观测。 环境信息 系统环境&#xff1a;Kubernetes编程语言&#xff1a;.NET Core ≥ 2.1日志框架&#xff1a;Serilog探针类型&#xff1a;ddtrace 接入方案 准备工作 DataKit 部署 DataK…

软件推荐 篇三十七:安卓软件推荐IP Tools「IP工具」:全面解析网络状态与管理的必备神器

引言&#xff1a; 随着互联网的普及&#xff0c;网络已经成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都需要通过网络来进行各种操作。然而&#xff0c;网络问题的出现往往会给我们带来诸多困扰。为了更好地管理和优化网络&#xff0c;我们…