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

news2024/11/26 4:53:23

在这里插入图片描述

分析​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 hashtable
	private:		
		CSystemId m_sysid; // source system id		
		IMDProvider *m_pmdp; // value of the hashed element
	public:	
		SLink m_link; // generic link
				
		static 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 provider
	void RegisterProvider(CSystemId sysid, IMDProvider *pmdp);
	// register given MD providers
	void 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 accessor
		SMDProviderElem 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 object
	public:		
		IMDId *m_mdid; // hash key		
		SLink m_link; // generic link
		// invalid key
		static 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 tables
		static BOOL Equals(const MdidPtr &left_mdid, const MdidPtr &right_mdid);
		// hash function for cost contexts hash table
		static ULONG HashValue(const MdidPtr &mdid);
	};

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

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

相关文章

[分布式] Ceph实战应用

目录 一、建 CephFS 文件系统 MDS 接口服务端操作客户端操作 二、创建 Ceph 块存储系统 RBD 接口创建 Ceph 对象存储系统 RGW 接口OSD 故障模拟与恢复 一、建 CephFS 文件系统 MDS 接口 服务端操作 1)在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds creat…

流程图实现,基于vue2实现的流程图

1.基本思路 flex布局 伪元素实现竖直的连接线组件递归 2.效果图 2.1基础的(未截全,大致长这样) 2.2带有收缩功能的,可以展开和收缩并显示数量 3.待需要优化的点,根节点居中是基于整个流程图大小的来居中的&#xf…

【Spring Boot】Spring Boot的系统配置 — 实战:实现系统多环境配置

实战:实现系统多环境配置 在实际项目开发的过程中,需要面对不同的运行环境,比如开发环境、测试环境、生产环境等,每个运行环境的数据库、Redis服务器等配置都不相同,每次发布测试、更新生产都需要手动修改相关系统配置…

delete删除的数据如何恢复?delete删除的数据找回

在数字时代,我们经常处理大量的数据,无论是工作、学习还是个人生活。然而,数据的增多也带来了新的挑战,其中最令人头疼的便是数据丢失问题,例如因操作失误而删除了重要的文件或数据。本文将探讨如何恢复delete删除的数…

租赁小程序开发|在线租赁小程序开发|租赁系统源码

近年来,随着共享经济的兴起,租赁服务逐渐成为了人们生活中不可或缺的一部分。为了方便用户租赁物品或者服务,租赁小程序应运而生。租赁小程序开发具有许多功能优势,使其成为租赁行业的重要工具。本文将介绍一些租赁小程序开发的功…

研发效能认证学员作品:如何实现在DevSecOps的测试左移丨IDCF

作者:赵露润 (现就职于赛意信息科技有限公司) 研发效能(DevOps)工程师认证学员、PMP 认证、ITIL4 认证 前言 一个自主研发的ITDevOps系统,承载的主要功能有产品信息树管理,敏捷协同管理&…

如何使用自动化构造随机路由模型

为什么要仿真随机路由? 路由器测试中,为了最大程度还原现网路由情况,评估路由器在现网环境下稳定工作各项指标,需要对导入路由进行离散仿真,目前路由仿真可分为导入路由与生成路由两种方式,导入路由需要现…

S3C2440使用GPIO输入功能控制按键

文章目录 前言一、设置GPIO输入模式二、检测开关1.配置功能2.具体实现 总结 前言 由于上期分享的使用GPIO去控制引脚输出模式点亮LED,那么本期主要介绍一下使用GPIO设置为输入模式,用到的硬件有板载的按键;开发环境也是依赖于S3C2440开发板&…

Hyper-V安装Ubuntu-18.04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、准备工作?二、下载指定的Ubuntu ISO镜像三、开始配置1.点击快速创建2.选择安装源 四、开始安装五、配置启动项总结 前言 最近有个很扯淡的问题…

Linux 学习记录51(ARM篇)

Linux 学习记录51(ARM篇) 本文目录 Linux 学习记录51(ARM篇)一、计算机的组成二、编译的原理三、指令和指令集1. 机器指令2. 汇编指令3. 指令集(1. RISC:精简指令集(2. CISC:复杂指令集(3. 精简指令集补充 四、ARM相关介绍1. Arm发展简介2. ARM架构3. AR…

仓库管理系统到底包括哪些方面?

仓库管理系统到底包括哪些方面? 1)入库 采购产品到货后,需要进行入库处理。填写采购单号,供应商信息,仓库信息,以及入库明细,提交流程完成入库登记。 “入库明细”中选择货品编码后&#xff…

四阶龙格-库塔方法matlab程序与误差对比

四阶龙格-库塔方法matlab程序与误差对比 简介参考code四阶龙格-库塔函数微分方程函数主程序 结果分析 简介 本例子函数参考了【1】中的函数,增加了解析方法的函数与四阶龙格-库塔方法对比,并计算了百分比误差,最大误差在0.3%左右。 参考 【…

网站创建002:head内容

一个html网站&#xff0c;包括html根、head头、body身体 首先来看head&#xff0c;head操作的是页签标题&#xff0c;如下 1、给head添加图标&#xff0c;如下 <link rel"icon" href"C:\Users\86158\Desktop\网站创建\favicon.ico">2、给网站添加搜索…

Python测试框架Pytest的基础入门

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

依赖注入三种方式,以及传统xml文件传参,还包括@Bean方式传参,还有Resource注入(详细版,每步都有提及)

获取bean对象&#xff0c;也称为对象装配&#xff0c;对象注入&#xff0c;依赖注入。 对象装配的实现方法有3种&#xff1a; 1.属性注入&#xff1b; 2.构造方法注入&#xff1b; 3.Setter注入。 再讲本节内容之前&#xff0c;我们先来提两个传参的方式&#xff0c;首先呢…

Twitter重新突围或许借助国产技术是个好办法

Meta公司近期推出的Threads 被网友戏称为“Twitter杀手”&#xff0c;该应用上线仅一天&#xff0c;用户就突破了3000 万人。外界普遍认为&#xff0c;这是推特上线17年来遭遇的最严峻危机。面对扎克伯格来势汹汹的挑战马斯克会如何快速组织反击&#xff1f; 前段时间闹得沸沸扬…

想要提高产品使用率?掌握以下关键策略,让你的用户爱不释手!

如果你的产品已经推出市场&#xff0c;但你发现用户的使用率并不如你预期的那样高。你想知道如何提高产品的使用率&#xff0c;并让更多的用户喜欢和频繁使用你的产品吗&#xff1f;别担心&#xff0c;你可以采取一些策略来提高产品的使用率并让用户更愿意使用它。 1. 了解你的…

el-date-picker组件的picker-options常规属性设置

查询已发生的配置项 // 日期选择器快捷键配置&#xff08;一般过去时&#xff09; pickerOptions: {shortcuts: [{text: 今天,onClick(picker) {let start new Date();let end new Date();picker.$emit(pick, [start, end]);}},{text: 昨天,onClick(picker) {let start new…

【高阶数据结构】——并查集

文章目录 并查集的原理并查集的实现并查集的应用 并查集的原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合, 然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归…

msvcp140.dll丢失的4种解决方法,快速修复msvcp140.dll文件

msvcp140.dll丢失在所有的dll文件丢失里面&#xff0c;也算是经常丢失的老油条了&#xff0c;我们应该对它都不陌生吧&#xff0c;不过直到今天都还有人不知道怎么修复msvcp140.dll文件&#xff0c;小编觉得非常有必要来给大家详细的说说吧&#xff0c;聊一下msvcp140.dll丢失的…