【YashanDB知识库】绑定参数,同一个sql多个执行计划的问题

news2024/9/25 16:33:57

问题现象

同一个sql有两个执行计划,是否合理?

它的EXECUTIONS,ELAPSED_TIME等统计信息怎么看,是独立分开的还是统一计算的?

如下图:

问题影响版本

tpcc测试:23.2.1.100

问题的风险及影响

影响EXECUTIONS等sql统计信息的计算

问题发生原因

同一条sql,特别是绑定参数的sql,参数类型不同,会导致生成不同的执行计划。

分析及处理过程

例子测试分析

复现例子:

drop table if exists tmp2;
create table tmp2(c1 int,c2 double,c3 int,c4 int,c5 int,c6 int,c7 int,c8 timestamp,c9 varchar(500),c10 int) ;

如上,第二个参数是int和double时,生成了两个执行计划,有两个plan_hash_value,如下图:

后跑几次,发现其中executions、cpu_time这些值共享,统计到一起,所以两条结果的这些字段值一样。

代码分析

select * from v$sql; 调用过程

v$sql是动态表,数据都存放在内存中。

anrDedicatedServiceNoLogin
anrResponse
anrDirectExecute
anlExecute
doAnlExecute
doExecute
fetchQuery
fetchPlanWithPreProj
anlFetchPlan
doAnlFetchPlan
fetchSelectPlan
anlFetchPlan
doAnlFetchPlan
fetchTableFullScan
ankFetch
ankFtFetch
{
ftSqlFetch //获取一条v$sql数据
ankExecFilter //filter筛选
}

ftsqlFetch 数据:

  • 每一条sql都是一个anlcontext对象,存放在sqlpool中。

  • anlGetNextNewPlan(stmt, ctxCursor),通过这个接口从sqlpool中,根据poolid和bucketid从sqlpool中取的anlcontext,根据anlcontext的plan取数据。

  • 一个plan一条数据,每条数据的plan_hash_value都不一样。

  • 统计数据存放在anlcontext中的stats:iostat、timestat、runstat、gcstat

所以同一条sql不同的plan,stats数据其实相同。

anlcontext管理

sqlpool有两个:
typedef enum EnAnlPoolType {
    ANL_MAIN_POOL = 0, -- 普通sql pool
    ANL_PL_POOL, -- pl sql pool
    __ANL_POOL_TYPE_COUNT__
} AnlPoolType;
 
//生成一个新sql的anlcontext,调用流程
doParseDML
anlHashSQL // 生成sql hash
anlTryReuseContext // 从 inst->sqlpool,buckets中比较已有的anlcontext,是否有同一个sql
anlCreateContext // 没有从sqlpool中找到,从ANL_MAIN_POOL中申请新的anlcontext
anlPoolInsert // anlcontext插入pool中,anlLruInsert lru插入
 
//第二条执行计划,调用流程
//sql的第二个plan,在anlexecute中生成。放在anlcontext的planContexts中
execExplain
replaceNewPlan
doReplaceNewPlan
anlCreateAndUseNewPlan
anlInsertPlan

pool内存池分配方式

SGA总内存分配接口:anrCreateGlobalArea

SGA总内存组成方式:data buff + vm buff + large pool + redo buff + shared pool + dbwr buff + audit buff + app pool + hot cache + pq pool +job pool

globalArea:anrStartInstance时一次性申请如下表空间数据,

typedef enum EnMzoneId {
    MZONE_DATA_BUFFER = 0, // 配置参数:DATA_BUFFER_SIZE attr->dataBufSize(64M)
    MZONE_TEMP_BUFFER, // 配置参数:VM_BUFFER_SIZE attr->tempBufSize (32M)
    MZONE_LARGE_POOL, // 配置参数:LARGE_POOL_SIZE attr->largePoolSize(16M)
    MZONE_LOG_BUFFER, // 配置参数:REDO_BUFFER_SIZE attr->logBufSize(8M)
    MZONE_HOT_CACHE, // 配置(隐藏)参数:_HOT_CACHE_SIZE attr->hotCacheSize(16M)
    MZONE_SHARE_POOL, // 配置参数:SHARE_POOL_SIZE attr->sharePoolSize(256M)
    MZONE_APP_POOL, // 配置参数:WORK_AREA_POOL_SIZE attr->appPoolSize(16M)
    MZONE_DBWR_BUFFER, // 配置参数:DBWR_BUFFER_SIZE attr->dbwrBufSize(4M)
    MZONE_JOB_POOL, // 默认4M
    MZONE_PQ_POOL, // 配置(隐藏)参数:PQ_POOL_SIZE attr->pqPoolSize(parallel execute buff 默认:16M)
    MZONE_AUDIT_BUFFER, // 配置参数:AUDIT_QUEUE_SIZE attr->auditQueueSize(16M)
    MZONE_COUNT,
} MzoneId;

shared pool 分配

分配接口:setShareBuffers

shared pool内存拆分:sql pool + dc pool + lock pool + cursor pool等

typedef enum EnSharePoolItemId {
    SHARE_SQL_POOL = 0, // 配置(隐藏)参数:SQL_POOL_SIZE attr->sqlPoolBuf  (sqlPoolSize:百分比默认50)
    SHARE_DC_POOL, //  配置(隐藏)参数:DICTIONARY_CACHE_SIZE profile->dictCache (dictCacheSize:百分比默认25)
    SHARE_LOCK_POOL, //  配置(隐藏)参数:LOCK_POOL_SIZE profile->lockPool(lockPoolSize:16M)
    SHARE_CURSOR_POOL, //  配置(隐藏)参数:CURSOR_POOL_SIZE profile->cursorPool(cursorPoolSize:32M)
    SHARE_DSTB_POOL, //  配置(隐藏)参数:DSTB_POOL_SIZE  (分布式,dstbPoolSize:默认百分比0 )
    SHARE_GCS_RESOURCE, // 集群(主备)才有  根据dataBufSize的block数计算出来
    SHARE_GLS_RESOURCE, // 集群才有   根据dataBufSize的block数计算出来
    SHARE_GRC_REQUEST, // 集群才有   根据lockPoolSize计算
    SHARE_GCS_PASTCOPY, // 集群才有  根据 maxHandlers计算
    SHARE_COUNT, // 剩余 profile->sharePool中
} SharePoolItemId;

sql pool buf分配:

调用接口:anlCreateSQLPool

sql pool组成:main pool buff + pl pool buff

ANL_MAIN_POOL: (9/10) * sqlpoolsize
   mainPoolSize = attr->sqlPoolSize - plPoolSize;
    AnlPool* mainPool = &inst->sqlPool[ANL_MAIN_POOL];
 
ANL_PL_POOL:(1/10) * sqlpoolsize
        #define ANL_PL_POOL_MEMORY_PCT (CodUint64)10
        #define ANL_PL_POOL_SIZE(totalSize) ((totalSize) * ANL_PL_POOL_MEMORY_PCT / 100)
        plPoolSize = ANL_PL_POOL_SIZE(attr->sqlPoolSize)

sql buff分配

static void setSQLBuffers()
{
    AnlAttr* attr = anlGetAttr(gInstance->sql);
    attr->appPoolBuf = g_MemoryZones[MZONE_APP_POOL].buffer;
    attr->jobPoolBuf = g_MemoryZones[MZONE_JOB_POOL].buffer;
    attr->jobPoolSize = g_MemoryZones[MZONE_JOB_POOL].size;
    attr->pqPoolBuf = g_MemoryZones[MZONE_PQ_POOL].buffer;
    attr->auditQueueBuf = g_MemoryZones[MZONE_AUDIT_BUFFER].buffer;
}

kernel buff分配

static void setKernelBuffers()
{
    KernelAttr* profile = ankGetKernelAttr(gInstance->kernel);
    profile->dataBuf = g_MemoryZones[MZONE_DATA_BUFFER].buffer;
    profile->logBuf = g_MemoryZones[MZONE_LOG_BUFFER].buffer;
    profile->tempBuf = g_MemoryZones[MZONE_TEMP_BUFFER].buffer;
    profile->hotCache = g_MemoryZones[MZONE_HOT_CACHE].buffer;
    profile->largePool = g_MemoryZones[MZONE_LARGE_POOL].buffer;
    profile->dbwrBuf = g_MemoryZones[MZONE_DBWR_BUFFER].buffer;
}

缓存相关视图

经验分享

1、同一个sql,有多个执行计划,是正常现象

2、v$sql中的executions、cpu_times等一些统计字段,同一个sql都是同样的值,不能做加减等操作。

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

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

相关文章

无人机公司销售需要什么资质

国家民航局于2024年1月1日实施了《无人驾驶航空器飞行管理暂行条例》,根据这个管理条例里面的 第十一条 使用除微型以外的民用无人驾驶航空器从事飞行活动的单位应当具备下列条件,并向国务院民用航空主管部门或者地区民用航空管理机构申请取得民用无人驾…

若依+AI项目开发(二)

后端代码分析 二次开发 开始执行 生成成功 创建子模块

电子签章-开放签应用

开放签电子签章系统开源工具版旨在将电子签章、电子合同系统开发中的前后端核心技术开源开放,适合有技术能力的个人 / 团队学习或自建电子签章 \ 电子合同功能或应用,避免研发同仁在工作过程中重复造轮子,降低电子签章技术研发要求&#xff0…

如何解决ChromeDriver 126找不到chromedriver.exe问题

引言 在使用Selenium和ChromeDriver进行网页自动化时,ChromeDriver与Chrome浏览器版本不匹配的问题时有发生。最近,许多开发者在使用ChromeDriver 126时遇到了无法找到chromedriver.exe文件的错误。本文将介绍该问题的原因,并提供详细的解决…

mysql-bin 恢复数据库

能看到这里的同学估计肯定摊上大事了吧!不要慌,一定要冷静,记录一下作者的大事件吧,黑客通过SQL注入的方式执行了一段SQL : DROP DATABASE ****** 后果就是导致整个数据库被删了,当时心是拔凉拔凉的&#x…

3.2、数据结构-数组、矩阵和广义表

数组结构 数组是定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。N维数组是一种“同构”的数据结构,其每个数据元素类型相同、结构一致。 一个m行n列的数组表示如下: 其可以表示为行向量形式(一行一行的数据)或者列向量形式(一…

收银系统源码视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

Haproxy 可观测性最佳实践

HAProxy 是一款广泛使用的高性能负载均衡器,支持 TCP 和 HTTP 协议,提供高可用性、负载均衡和代理服务。 HAProxy 2.0 以上版本提供了完善的指标暴露体系,方便观测云收集对应的指标信息。 版本要求 HAProxy 2.0 HAProxy Enterprise 2.0r1 HAP…

自定义协议(应用层协议)——网络版计算机基于TCP传输协议

应用层:自定义网络协议:序列化和反序列化,如果是TCP传输的:还要关心区分报文边界(在序列化设计的时候设计好)——粘包问题 1、首先想要使用TCP协议传输的网络,服务器和客户端都应该要创建自己…

AI发展下的伦理挑战:构建未来科技的道德框架

一、引言 随着人工智能(AI)技术的飞速发展,我们正处在一个前所未有的科技变革时代。AI不仅在医疗、教育、金融、交通等领域展现出巨大的应用潜力,也在日常生活中扮演着越来越重要的角色。然而,这一技术的迅猛进步也带来…

RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习_2_登录

文章目录 一、登录1.生成验证码2.验证码作用1.大体流程2.代码层面(我们都是从前端开始看起) 一、登录 1.生成验证码 基本思路: 后端生成一个表达式,例如34?7,显而易见后面是答案截取出来题干和答案把题干11?变成图片,变成流&a…

下属不把你当回事?就做好这3步,他们会对你唯命是从!

下属不把你当回事?就做好这3步,他们会对你唯命是从! 一:规范制度,做事有理可依 企业管理好比是满汉全席,制度才是压轴大菜,人性化说教不过是菜盘边上的点缀罢了。 千万不可舍本逐末。 事要有人干…

React间的组件通信

一、父传子&#xff08;props&#xff09; 步骤 父组件传递数据&#xff0c;子组件标签身上绑定属性子组件接收数据&#xff0c;props的参数 // 子组件 function Son(props) {return (<div>this is Son, {props.name}</div>) }// 父组件 function App() {const n…

如何使用 DSPy 构建多步骤推理的 RAG 系统

一、前言 检索增强生成 (RAG) 系统已经成为构建基于大语言模型 (LLM) 应用的强大方法。RAG 系统的工作原理是&#xff1a;首先使用检索模型从外部知识源检索相关信息&#xff0c;然后使用这些信息来提示 LLM 生成最终的响应。 然而&#xff0c;基本的 RAG 系统&#xff08;也…

谷粒商城实战笔记-47-商品服务-API-三级分类-网关统一配置跨域

文章目录 一&#xff0c;跨域问题1&#xff0c;跨域问题产生的原因2&#xff0c;预检请求3&#xff0c;跨域解决方案3.1 CORS (Cross-Origin Resource Sharing)后端配置示例&#xff08;Spring Boot&#xff09; 3.2 JSONP (JSON with Padding)3.3 代理服务器Nginx代理配置示例…

python自动化中正则表达式提取(适用于提取文本结果)

对于结果是json格式的我们经常使用jsonpath&#xff0c;但是很多时候我们需要从一些文本中提取数据&#xff0c;这个时候正则表达式的提取就很重要&#xff0c;这边主要分享一些正则表达式的提取方法和应用场景的实践&#xff0c;主要介绍两种用法re.search()跟re.findall() 1…

基于springboot+vue+uniapp的居民健康监测小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

系留无人机在技术上有哪些优势或创新点

系留无人机在技术上具有显著的优势和创新点&#xff0c;主要体现在以下几个方面&#xff1a; 1. 长航时飞行作业&#xff1a; - 系留无人机系统由地面通过市电、发电机或电池组供电&#xff0c;并通过系留线缆将电力传输至无人机&#xff0c;实现了不间断供电。 - 这种供电方式…

概率论--矩估计

目录 简介 矩估计法的基本步骤 延伸 矩估计法在大样本情况下的准确性和有效性如何评估&#xff1f; 在实际应用中&#xff0c;矩估计法的局限性有哪些具体例子&#xff1f; 如何处理矩估计法在某些情况下可能出现的不合理解或无法唯一确定参数的问题&#xff1f; …

江科大/江协科技 STM32学习笔记P13

文章目录 TIM定时中断1、TIM简介计数器预分频器自动重装寄存器 2、定时器类型基本定时器主模式触发DAC 通用定时器高级定时器 3、定时器原理定时中断基本结构预分频器时序计数器时序RCC时钟树 TIM定时中断 1、TIM简介 定时器的基准时钟一般都是主频72MHz&#xff0c;如果对72M…