ORCA优化器浅析——​MD Accessor的三级缓存

在这里插入图片描述

分析​MD Accessor对元数据的缓存能力

set client_min_messages='log';
set optimizer to on;
set optimizer_print_optimization_stats to on;
--执行SQL

在这里插入图片描述

optimizer_print_optimization_stats GUC会打印处ORCA优化器优化流程中的各步骤的统计数据。分析打印日志如下,由CMDAccessor::~CMDAccessor析构函数打印出来,打印的是m_dFetchTimem_dLookupTime两个成员变量。

2023-07-11 16:46:03:555868 CST,THD000,TRACE,"[OPT]: Total metadata fetch time: 13176.370000ms [OPT]: Total metadata lookup time (including fetch time): 14591.598000ms

从src/backend/gporca/libgpopt/src/mdcache/CMDAccessor.cpp/CMDAccessor::GetImdObj(IMDid *)函数来看,object not found in MD cahce: retrieve it from MD provider来看,就是从MD CACHE中找不到对应的对象就从MD provider中获取,代码中使用了timeFetch CTimerUser来统计开始结束时间差,如下代码所示。
在这里插入图片描述

orca对元数据有3层缓存: local hashtable、MD cache、MD provider。m_dLookupTime体现的是从这3层缓冲中获取元数据对象的耗时,包含了如果从MD provider中获取的元数据对象需要更新进MD cache和local hashtable中,同样从MD cache中查找到的也需要更新到local hashtable中。
在这里插入图片描述

​不同会话下,执行获取元数据缓存耗时:
2023-07-12 14:45:01:855297 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 885ms”,
2023-07-12 14:45:30:500581 CST,THD000,TRACE,“[OPT]: Total metadata fetch time: 14473.282000ms
[OPT]: Total metadata lookup time (including fetch time): 16382.339000ms
第1次执行计划耗时29s,元数据获取时间14s,元数据查找时间16s
2023-07-12 14:49:25:139170 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 779ms”,
2023-07-12 14:49:52:102328 CST,THD000,TRACE,”[OPT]: Total metadata fetch time: 13731.516000ms
[OPT]: Total metadata lookup time (including fetch time): 15566.536000ms
第2次执行计划耗时27s,元数据获取时间13s,元数据查找时间15s
2023-07-12 14:57:24:431293 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 817ms”,
2023-07-12 14:57:49:018854 CST,THD000,TRACE,“[OPT]: Total metadata fetch time: 12863.061000ms
[OPT]: Total metadata lookup time (including fetch time): 14672.054000ms
第3次执行计划耗时25s,元数据获取时间12s,元数据查找时间14s
2023-07-12 15:14:22:723433 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 863ms”,
2023-07-12 15:14:47:571352 CST,THD000,TRACE,”[OPT]: Total metadata fetch time: 13167.755000ms
[OPT]: Total metadata lookup time (including fetch time): 14981.800000ms
第4次执行计划耗时25s,元数据获取时间13s,元数据查找时间14s
同一个会话下,执行获取元数据缓存耗时:
2023-07-12 15:21:08:237880 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 870ms”,
2023-07-12 15:21:34:591085 CST,THD000,TRACE,“[OPT]: Total metadata fetch time: 13729.502000ms
[OPT]: Total metadata lookup time (including fetch time): 15601.946000ms
第1次执行计划耗时26s,元数据获取时间13s,元数据查找时间15s
2023-07-12 15:21:39:953092 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 781ms”,
2023-07-12 15:22:04:924564 CST,THD000,TRACE,”[OPT]: Total metadata fetch time: 13512.558000ms
[OPT]: Total metadata lookup time (including fetch time): 15360.607000ms
第2次执行计划耗时25s,元数据获取时间13s,元数据查找时间15s
2023-07-12 15:22:07:900124 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 205ms”,
2023-07-12 15:22:15:184400 CST,THD000,TRACE,“[OPT]: Total metadata fetch time: 0.000000ms
[OPT]: Total metadata lookup time (including fetch time): 1027.527000ms
第3次执行计划耗时8s,元数据获取时间0s,元数据查找时间1s
2023-07-12 15:22:15:542861 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 202ms”,
2023-07-12 15:22:22:561944 CST,THD000,TRACE,”[OPT]: Total metadata fetch time: 0.000000ms
[OPT]: Total metadata lookup time (including fetch time): 960.423000ms
第4次执行计划耗时7s,元数据获取时间0s,元数据查找时间0.9s
2023-07-12 15:22:28:083738 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 192ms”,
2023-07-12 15:22:34:790351 CST,THD000,TRACE,“[OPT]: Total metadata fetch time: 0.000000ms
[OPT]: Total metadata lookup time (including fetch time): 946.501000ms
第5次执行计划耗时6s,元数据获取时间0s,元数据查找时间0.9s
同一个会话下,执行获取元数据缓存耗时,增加语句耗时:
2023-07-12 15:40:02:665883 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 227ms”,
2023-07-12 15:40:11:426017 CST,THD000,TRACE,”[OPT]: Total metadata fetch time: 0.000000ms

[OPT]: Total metadata lookup time (including fetch time): 1030.394000ms
psql:dwszzr2.sql:19: LOG: duration: 600431.348 ms statement: select * from pg_sleep(600);
2023-07-12 15:50:19:376402 CST,THD000,TRACE,“timer: [OPT]: Query To DXL Translation Time: 895ms”,
2023-07-12 15:50:46:477806 CST,THD000,TRACE,"[OPT]: Total metadata fetch time: 13853.042000ms

[OPT]: Total metadata lookup time (including fetch time): 15858.812000ms

三级缓存之MD provider hashtable

首先CMDAccessor类缓存了MD providers类,通过hashtable进行组织,实际上是以CSystemId作为键,IMDProvider作为值。代码上通过CSyncHashtable作为hashtable,哈希表中的element是SMDProviderElem,其实就是IMDProvider *m_pmdp指针。

	struct SMDProviderElem{ // element in the MD provider hashtableprivate:		CSystemId m_sysid; // source system id		IMDProvider *m_pmdp; // value of the hashed elementpublic:	SLink m_link; // generic linkstatic const SMDProviderElem m_mdpelemInvalid; // invalid key		SMDProviderElem(CSystemId sysid, IMDProvider *pmdp); // ctor		~SMDProviderElem(); // dtor	IMDProvider *Pmdp(); // return the MD provider		CSystemId Sysid() const; // return the system id		static BOOL Equals(const SMDProviderElem &mdpelemLeft, const SMDProviderElem &mdpelemRight); // equality function for hash tables		static ULONG HashValue(const SMDProviderElem &mdpelem); // hash function for MD providers hash table};

在这里插入图片描述
MD Accessor类提供了如下函数用于向MD provider hashtable插入新的MD provider,也提供了Pmdp函数通过sysid查找MD provider。

	// register a new MD providervoid RegisterProvider(CSystemId sysid, IMDProvider *pmdp);// register given MD providersvoid RegisterProviders(const CSystemIdArray *pdrgpsysid, const CMDProviderArray *pdrgpmdp);	IMDProvider *Pmdp(CSystemId sysid); // lookup an MD provider by system id//---------------------------------------------------------------------------
//	@function:
//		CMDAccessor::Pmdp
//	@doc:
//		Retrieve the MD provider for the given source system id
//---------------------------------------------------------------------------
IMDProvider *CMDAccessor::Pmdp(CSystemId sysid){SMDProviderElem *pmdpelem = NULL;{   // scope for HT accessorSMDProviderElem mdpelem(sysid, NULL /*pmdp*/);MDPHTAccessor mdhtacc(m_shtProviders, mdpelem);pmdpelem = mdhtacc.Find();}GPOS_ASSERT(NULL != pmdpelem && "Could not find MD provider");return pmdpelem->Pmdp();
}

三级缓存之MDCache

MDCache使用CCache类(LRU缓存、单次session中CCACHE_GCLOCK_INIT_COUNTER计数内有效。),其键为CMDKey,也就是IMDId metadata object;值为IMDCacheObject 元数据缓存对象。而CCache类定义在src/backend/gporca/libgpos/include/gpos/memory/CCahce.h文件下。​针对CCacheEntry有refcout和gclockcounter两种缓存替换评估指标,可以通过src/backend/gporca/libgpos/include/gpos/memory/CCache.h中的EvictEntries函数查看替换策略。由如下代码可以看出时间初始值为CCACHE_GCLOCK_INIT_COUNTER, cache_quota为初始大小
在这里插入图片描述
在这里插入图片描述

COptTasks::OptimizeTask函数会对CMDCache的CacheQuota进行设置

在这里插入图片描述

三级缓存之hashtable of cache accessors

在这里插入图片描述
m_shtCacheAccessors作为和CMDAccessor生命周期一致的单次优化流程中的hashtable,其键为Mdid指针,其值为SMDAccessorElem,其实也即是IMDCacheObject元数据缓存对象。

	struct SMDAccessorElem{private:		IMDCacheObject *m_imd_obj; // hashed objectpublic:		IMDId *m_mdid; // hash key		SLink m_link; // generic link// invalid keystatic const MdidPtr m_pmdidInvalid;		SMDAccessorElem(IMDCacheObject *pimdobj, IMDId *mdid); // ctor		~SMDAccessorElem(); // dtor 		IMDCacheObject *GetImdObj(){return m_imd_obj;} // hashed object		IMDId *MDId(); // return the key for this hashtable element// equality function for hash tablesstatic BOOL Equals(const MdidPtr &left_mdid, const MdidPtr &right_mdid);// hash function for cost contexts hash tablestatic ULONG HashValue(const MdidPtr &mdid);};

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

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

相关文章

C++核心编程之函数高级使用

目录 一、函数的默认参数 二、函数占位参数 三、函数重载 四、函数重载-注意事项 一、函数的默认参数 在C中,函数的形参列表中的形参是可以有默认值的 语法:返回值类型 函数名 (参数默认值){} 示例1: #includ…

Windows10下ChatGLM2-6B模型本地化安装部署教程图解

随着人工智能技术的不断发展,自然语言处理模型在研究和应用领域备受瞩目。ChatGLM2-6B模型作为其中的一员,以其强大的聊天和问答能力备受关注,并且最突出的优点是性能出色且轻量化。然而,通过云GPU部署安装模型可能需要支付相应的…

在Vitis IDE中使用第三方库 libtiff 保存 tiff 文件

目的和思路 一个Vitis IDE 裸机项目,需要将视频帧无损地保存下来 由于每帧的像素数据是 16bit 1通道的 bayer 格式,满足这一需求的图像格式似乎只有 tiff 格式 开源的tiff 库是 libtiff,而在 Vitis IDE 裸机项目中要使用的话就需要交叉编译…

数据结构day3(2023.7.17)

一、Xmind整理: 二、课上练习: 练习1:时间复杂度 时间复杂度:只保留最高阶f(n)3*n^2n^2100nT(n)O(3*n^3n^2100n)O(3*n^3)O(n^3)1>O(1):常数阶int ta; 1ab; 1at; 1f(n)3T(n)O(3)O(3*n^0)O(n^0)O(1)2>O(n): 线性阶for…

Python 和 RabbitMQ 进行消息传递和处理

一、RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)标准。它的官方客户端提供了多种编程语言的接口,包括 Python、Java 和 Ruby 等。它支持消息的持久化、多种交换机类型、消息通知机制、灵活…

Ubuntu 18.04 Docker 安装配置 Apollo 6.0

百度 Apollo 安装测试(1) Apollo 6.0 安装完全指南 在这一步出错: 进入到 Apollo 源码根目录,打开终端,执行下述命令以启动 Apollo Docker 开发容器 ./docker/scripts/dev_start.sh并没有成功启动 Apollo docker 开发…

gma 2.0.0a3 (2023.07.17) 更新日志

安装 gma 2.0.0a3 pip install gma2.0.0a3新增 1、为矢量要素(Feature)添加 【Difference】(差集)方法   取第一个矢量要素与第二个矢量要素的几何差集。  2、为矢量要素(Feature)添加几种几何形状测试…

LLaMA(Open and Efficient Foundation Language Models )论文解读(二)

此篇博客主题:LLAMA模型数据、训练时长、功耗及碳排放量 LLaMA: Open and Efficient Foundation Language Models paper https://arxiv.org/pdf/2302.13971v1.pdf 1 训练样本 Overall, our entire training dataset contains roughly 1.4T tokens after tokenization. For mo…

求根节点到叶节点数字之和

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。…

Ubuntu环境搭建

本文以Ubuntu 18.04为例 安装repo mkdir ~/bin export PATH~/bin:$PATH如果可以访问 google 的地址,下载 Repo 工具,并确保它可执行: curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod ax ~/bin/rep…

left join 和except方法区别和联系

目录 相同点: left join except 不同点 假设有两个表:A客户表 和 B客户表,客户uid是唯一主键 相同点: 查询在A中的客户 但不在B中,也就是图中的阴影部分,left join 和except方法都可以实现 left join …

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…