Mongodb聚合:$planCacheStats
执行查询时,MongoDB 查询规划器会根据可用索引选择并缓存效率最高的查询计划。$planCache可以返回所有集合的查询计划缓存信息。要使用$planCache,必须把$planCacheStats阶段放在管道最前面。
语法
{ $planCacheStats: { } }
使用
$planCacheStats必须是管道的第一个阶段$planCacheStats不能应用于事务和$facet阶段$planCacheStats需要的读关注级别为"local"- 如果系统启用了权限控制,用户必须要有对集合的
planCacheRead授权 - 当使用查询加密,
$planCacheStats阶段会忽略对加密集合的操作,即便是操作被正常缓存。
读取偏好
$planCacheStats在选择返回计划缓存信息的主机时,会遵守读取偏好。
应用程序可能以副本集的不同成员为目标。因此,每个副本集成员可能会收到不同的读取命令,并拥有与其他成员不同的计划缓存信息。尽管如此,在副本集或分片集群上运行$planCacheStats仍会遵守正常的读取优先规则。也就是说,在副本集上,该操作只从副本集的一个成员处收集计划缓存信息;在分片集群上,该操作只从每个分片副本集的一个成员处收集计划缓存信息。
输出
$planCacheStats的输出取决于完成查询所使用的查询引擎,version字段的值表明使用了哪个查询引擎:
1表示使用了经典引擎。2表示使用了基于时隙的查询执行引擎。
经典执行引擎
对于使用经典执行引擎的查询,$planCacheStats会返回与下面类似的文档:
{"version" : 1,"createdFromQuery" : <document>,"queryHash" : <hexadecimal string>,"planCacheKey" : <hexadecimal string>,"isActive" : <boolean>,"works" : <NumberLong>,"cachedPlan" : {"stage" : <STAGE1>,"filter" : <document>,"inputStage" : {"stage" : <STAGE2>,...}},"timeOfCreation" : <date>,"creationExecStats" : [ //每个候选计划的执行统计文档{"nReturned" : <num>,"executionTimeMillisEstimate" : <num>,"totalKeysExamined" : <num>,"totalDocsExamined" :<num>,"executionStages" : {"stage" : <STAGE A>,..."inputStage" : {"stage" : <STAGE B>,...}}},...],"candidatePlanScores" : [<number>,...],"indexFilterSet" : <boolean>,"estimatedSizeBytes" : <num>,"host" : <string>,"shard" : <string>
}
对于使用基于slot的查询执行引擎的查询,$planCacheStats会返回与下面类似的文档:
{"version" : 2,"queryHash" : <hexadecimal string>,"planCacheKey" : <hexadecimal string>,"isActive" : <boolean>,"works" : <NumberLong>,"cachedPlan" : {"slots" : <string>,"stages": <string>},"indexFilterSet" : <boolean>,"estimatedSizeBytes" : <num>,"host" : <string>
}
每份文档都包含各种查询计划和执行统计信息,包括:
| 字段 | 说明 |
|---|---|
version | 查询引擎的版本号,1为经典引擎,2为基于slot的执行引擎 |
createdFromQuery | 一个包含了产生该缓存条目的特定查询的文档 |
isActive | 布尔值,表示是否处于活动状态,如果为true,表示查询规划器当前正在使用它产生查询计划;如果为false,则表示查询规划期当前没有使用它 |
queryHash | 一个16进制格式的字符串,就是查询模型的哈希值 |
works | 查询规划器评估候选计划的试运行期间查询执行计划执行的 "工作单元 "数量 |
timeOfCreation | 创建条目的时间 |
creationExecStats | 执行统计文档数组。该数组包含每个候选计划的文档 |
candidatePlanScores | creationExecStats数组中列出的候选计划的得分数组 |
indexFilterSet | 布尔值,表示查询形状是否存在索引过滤器 |
estimatedSizeBytes | 计划缓存条目的估计大小(字节) |
host | mongod实例的主机名和端口号。当运行于分片集群时,操作返回每个分片副本集的信息,并使用分片和主机字段进行区分 |
shard | 分片名称,仅在分片集群上运行时可用 |
举例
下面的例子使用orders集合:
db.orders.insertMany( [{ "_id" : 1, "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type": "apparel" },{ "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type": "electronics" },{ "_id" : 3, "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type": "apparel" },{ "_id" : 4, "item" : "abc", "price" : NumberDecimal("8"), "quantity" : 10, "type": "apparel" },{ "_id" : 5, "item" : "jkl", "price" : NumberDecimal("15"), "quantity" : 15, "type": "electronics" }
] )
在集合上创建以下索引:
db.orders.createIndex( { item: 1 } );
db.orders.createIndex( { item: 1, quantity: 1 } );
db.orders.createIndex( { quantity: 1 } );
db.orders.createIndex( { quantity: 1, type: 1 } );
db.orders.createIndex({ item: 1, price: 1 },{ partialFilterExpression: { price: { $gte: NumberDecimal("10")} } }
);
其中,索引{ item:1, price: 1 }是部分索引,仅索引价格字段大于或等于NumberDecimal("10")的文档。
运行下面的查询:
db.orders.find( { item: "abc", price: { $gte: NumberDecimal("10") } } )
db.orders.find( { item: "abc", price: { $gte: NumberDecimal("5") } } )
db.orders.find( { quantity: { $gte: 20 } } )
db.orders.find( { quantity: { $gte: 5 }, type: "apparel" } )
上面的查询是通过基于slot的查询执行引擎完成的。
返回查询缓存中所有条目的信息
下面的聚合管道使用$planCacheStats返回集合的计划缓存条目信息:
db.orders.aggregate( [{ $planCacheStats: { } }
] )
输出:
[{ version: '2',queryHash: '478AD696',planCacheKey: '21AE23AD',isActive: true,works: Long("7"),timeOfCreation: ISODate("2023-05-22T20:33:49.031Z"),cachedPlan: {...},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("8194"),host: 'mongodb1.example.net:27018'},{ version: '2',queryHash: '3D8AFDC6',planCacheKey: '1C2C4360',isActive: true,works: Long("6"),timeOfCreation: ISODate("2023-05-22T20:33:50.584Z"),cachedPlan: {...},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("11547"),host: 'mongodb1.example.net:27018'},{ version: '2',queryHash: '27285F9B',planCacheKey: '20BB9404',isActive: true,works: Long("1"),timeOfCreation: ISODate("2023-05-22T20:33:49.051Z"),cachedPlan: {...},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("7406"),host: 'mongodb1.example.net:27018'},{ version: '2',queryHash: '478AD696',planCacheKey: 'B1435201',isActive: true,works: Long("5"),timeOfCreation: ISODate("2023-05-22T20:33:49.009Z"),cachedPlan: {...},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("7415"),host: 'mongodb1.example.net:27018'}],
查找查询哈希缓存详情
要返回特定查询散列的计划缓存信息,可使用$planCacheStats阶段后,可以在planCacheKey字段上添加$match。
以下聚合管道使用$planCacheStats之后的$match阶段来返回特定查询散列的特定信息:
db.orders.aggregate( [{ $planCacheStats: { } },{ $match: { planCacheKey: "B1435201"} }
] )
输出:
[{version: '2',queryHash: '478AD696',planCacheKey: 'B1435201',isActive: true,works: Long("5"),timeOfCreation: ISODate("2023-05-22T20:33:49.009Z"),cachedPlan: {slots: '$$RESULT=s11 env: { s3 = 1684787629009 (NOW), s6 = Nothing, s5 = Nothing, s1 = TimeZoneDatabase(Asia/Kuwait...Etc/UCT) (timeZoneDB), s10 = {"item" : 1, "price" : 1}, s2 = Nothing (SEARCH_META) }',stages: '[2] nlj inner [] [s4, s7, s8, s9, s10] \n' +' left \n' +' [1] cfilter {(exists(s5) && exists(s6))} \n' +' [1] ixseek s5 s6 s9 s4 s7 s8 [] @"358822b7-c129-47b7-ad7f-40017a51b03c" @"item_1_price_1" true \n' +' right \n' +' [2] limit 1 \n' +' [2] seek s4 s11 s12 s7 s8 s9 s10 none none [] @"358822b7-c129-47b7-ad7f-40017a51b03c" true false \n'},indexFilterSet: false,isPinned: false,estimatedSizeBytes: Long("7415"),host: 'mongodb1.example.net:27018'}
]
相关文章:
Mongodb聚合:$planCacheStats
执行查询时,MongoDB 查询规划器会根据可用索引选择并缓存效率最高的查询计划。$planCache可以返回所有集合的查询计划缓存信息。要使用$planCache,必须把$planCacheStats阶段放在管道最前面。 语法 { $planCacheStats: { } }使用 $planCacheStats必须…...
8个简约精美的WordPress外贸网站主题模板
Simplify WordPress外贸网站模板 Simplify WordPress外贸网站模板,简洁实用的外贸公司wordpress外贸建站模板。 查看演示 Invisible Trade WP外贸网站模板 WordPress Invisible Trade外贸网站模板,做进出口贸易公司官网的wordpress网站模板。 查看演…...
本地缓存Ehcache的应用实践 | 京东云技术团队
java本地缓存包含多个框架,其中常用的包括:Caffeine、Guava Cache和Ehcache, 其中Caffeine号称本地缓存之王,也是近年来被众多程序员推崇的缓存框架,同时也是SpringBoot内置的本地缓存实现。但是除了Caffeine之外&…...
linux一键换源
使用方法 - LinuxMirrors 使用方法 一键执行命令# 中国大陆(默认) 海外地区 bash <(curl -sSL https://linuxmirrors.cn/main.sh)-----------------------------------| ⡇ ⠄ ⣀⡀ ⡀⢀ ⡀⢀ ⡷⢾ ⠄ ⡀⣀ ⡀⣀ ⢀⡀ ⡀⣀ ⢀⣀ || ⠧⠤ ⠇ ⠇⠸ …...
Python Scapy库实现ARP扫描和ARP欺骗
ARP扫描:检测指定IP网段中哪些主机是在线的,并获取它们的MAC地址 from scapy.all import * import argparse import threading import time import logging # 解析CIDR格式的网段,并返回IP地址列表 # >接受一个CIDR格式的网段…...
Fink CDC数据同步(六)数据入湖Hudi
数据入湖Hudi Apache Hudi(简称:Hudi)使得您能在hadoop兼容的存储之上存储大量数据,同时它还提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理。这两种原语分别是: Update/Delete记录:H…...
线程和进程的区别及基础线程创建
1 线程和进程的区别 资源分配和调度: 进程(火车)是操作系统进行资源分配和调度的最小单位。它有自己的独立资源空间,包括内存、文件句柄等。线程(车厢)是CPU调度的最小单位。一个进程可以包含多个线程&…...
如何使用postman进行接口调试
使用Postman进行接口调试 有些时候我们写代码的时候,会发现接口有报错,提示参数错误,我们为了更好的排查错误原因,可以在Postman上进行接口调试。将url,请求方式,参数,cookie都填写到Postman中…...
Leetcode 198 打家劫舍
题意理解: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代…...
相机图像质量研究(9)常见问题总结:光学结构对成像的影响--工厂镜头组装
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...
Linux内核与驱动面试经典“小”问题集锦(5)
接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(4) 问题6 问:mutex_lock和mutex_lock_interruptible的区别是什么? 备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。 答: 尽管…...
基于51 单片机的交通灯系统 源码+仿真+ppt
主要内容: 1)南北方向的绿灯、东西方向的红灯同时亮40秒。 2)南北方向的绿灯灭、黄灯亮5秒,同时东西方向的红灯继续亮。 3)南北方向的黄灯灭、左转绿灯亮,持续20秒,同时东西方向的红灯继续…...
【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏
蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…...
C#中实现串口通讯和网口通讯(使用SerialPort和Socket类)
仅作自己学习使用 1 准备部份 串口通讯需要两个调试软件commix和Virtual Serial Port Driver,分别用于监视串口和创造虚拟串口。网口通讯需要一个网口调试助手,网络上有很多资源,我在这里采用的是微软商店中的TCP/UDP网络调试助手࿰…...
LeetCode回溯算法的解题思路
回溯法概念 回溯法:一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即回溯并且再次尝试。 应用场景 回溯算…...
泰克示波器(TBS2000系列)数学运算功能使用
目录 1 数学运算菜单1.1 运算符选择1.2 信源选择1.3 数学运算结果 1 数学运算菜单 Math运算按钮,用于实现对两个通道的信号进行实时的“加、减、乘”运算,计算时信源1在前面,信源2在运算符的右边,设置时设置信源与运算符就行了。…...
数据结构与算法之美学习笔记:50 | 索引:如何在海量数据中快速查找某个数据?
目录 前言为什么需要索引?索引的需求定义构建索引常用的数据结构有哪些?总结引申 前言 本节课程思维导图: 在第 48 节中,我们讲了 MySQL 数据库索引的实现原理。MySQL 底层依赖的是 B 树这种数据结构。留言里有同学问我ÿ…...
Python(SQLite)executescript用法
SQLite 数据库模块的游标对象还包含了一个 executescript() 方法,这不是一个标准的 API 方法,这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用,它可以执行一段 SQL 脚本。 例如,如下程序使用 executescr…...
BUUCTF-Real-[ThinkPHP]IN SQL INJECTION
目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间: 2018-09-04 CVE 参考:CVE-2018-16385 最高严重级别:低风险 受影响的系统:ThinkPHP < 5.1.23 漏洞描述: ThinkPHP是一款快速、兼容、简单的轻量级国产P…...
python安装步骤
安装 Python 的步骤如下: 在 Python 官方网站(https://www.python.org)上下载 Python 安装程序。运行下载的安装程序。在安装程序中选择要安装的 Python 版本(通常选择最新版本),并选择安装目录。确保勾选…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
