Oracle绑定变量窥视与自适应游标共享

news2024/11/25 14:23:02

一.Oracle的绑定变量窥视与自适应游标共享

创建test表,列status存在2个值,有数据倾斜,在列status

create table test
as 
select rownum id,
    DBMS_RANDOM.STRING('A',12) name,
    DECODE(MOD(ROWNUM,500),0,'Inactive','Active') status
from all_objects
where rownum<=50000;

#建索引
create index test_id_ind on test(status);

#由于列倾斜,所以收集直方图信息
EXEC dbms_stats.gather_table_stats(user,'test',method_opt=>'for columns status size 254',cascade=>true);

select count(*) cnt,status from test group by status;

问题:如果SQL硬解析生成执行计划时“窥视”到的绑定变量刚好只适合少部分数据,不适合其他大多数数据,那么直到下一次硬解析前(一般是收集统计信息后才会触发硬解析),都会使用这个不优的执行计划。

解决:

1.收集直方图,当查询Active的时候,直方图观察到绝大多数都是Active,则会走全表扫描,当查询Inactive的时候,直方图观察到绝大多数都是Inactive,则会走索引扫描。

2.11g之后的自适应游标共享特性,优化器在使用adaptive cursor sharing后,已经可以为一个带有绑定变量的SQL产生出多个执行计划,这个特性非常有用对于列上数据有倾斜,在列上收集了直方图的SQL

使用自适应游标共享时,会遵循以下的步骤:


    1) 一条新的SQL语句第一次传入shared pool时,还是和曾经一样,进行硬解析。并且进行绑定变量窥视,计算where条件各个列的selectivity,该游标会被标记为是一个绑定敏感的游标(bind-sensitive cursor)。同一时候,oracle还会保留包括绑定变量的where条件的其它信息,比方selectivity等。Oracle会为该selectivity维持一个范围,oracle叫做立方体(cube)。仅仅要传入的绑定变量所产生的selectivity落在该范围里面,也就是落在该cube里面,就不产生新的运行计划,而直接拿该cube所相应的运行计划来用。


    2) 下次再次运行同样的SQL时,传入了新的绑定变量,如果使用新的绑定变量的selectivity落在已经存在的cube范围里,于是这次SQL的运行会使用该cube所相应的运行计划。

    3) 同样的查询再次运行时,如果所使用的新的绑定变量导致这时候的selectivity不再落在已经存在的cube里了,于是也就找不到相应的运行计划。于是系统会进行一个硬解析,这将产生第二个新的运行计划。并且新的selectivity以及相应的cube也会保存下来。也就是说,这时,我们分别有两个cube以及两个运行计划。

    4) 同样的查询再次运行时,如果所使用的新的绑定变量导致这时候的selectivity不落在现存的两个cube中的不论什么一个,所以系统又会进行硬解析。如果这时硬解析所产生的运行计划与第一次产生运行计划一样,也就是说,在第一次评估selectivitycube时过于保守,导致cube过小,进而导致了这一次的不必要的硬解析。于是,oracle会将第一次产生的cube与这次产生的cube合并成一个新的更大的cube。那么,下次再次进行软解析的时候,如果selectivity落在新的cube里,则会使用第一次所产生的运行计划。

实验:

var a varchar2(100)

set autotrace off

exec :a :='Inactive'

select /*+ find_me */ count(name) from test where status = :a;

select sql_text,sql_id,executions from v$sql where sql_text like '%find_me%';

查询ACS状态:

select sql_text,sql_id,executions from v$sql where sql_text like '%find_me%';

 select child_number,executions,buffer_gets,is_bind_sensitive s,is_bind_aware a from v$sql where sql_id='b3vywf9pt4cab';

Y表示该语句正在被窥视中,证明不确定该语句是不是执行的很好。

查看执行计划:

select * from table (dbms_xplan.display_cursor('b3vywf9pt4cab',0));

可以看到该语句是走索引的,是没有问题的,因为我给的绑定变量值是Inactive。

但是如果这时候 我给的绑定变量值是active,那就有很大的问题了,因为这时候全表扫描是最好的选择。

exec :a :='Active';

select /*+ find_me */ count(name) from test where status = :a;

此时这个sql仍然还只有一个游标。

多执行几次

select /*+ find_me */ count(name) from test where status = :a;

发现这个时候这个sql有第二个子游标了。A列的Y的意思是它是从其它的游标演变过来的。

绑定变量窥视与自适应共享游标建议:

10g 之前,由于没有ASC参数,绑定变量窥视参数一错到底,建议关闭。

11.2.0.4之后:建议全部开启。

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

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

相关文章

这本真绝!《自然语言处理新范式:基于预训练模型的方法》真的不要太强(附PDF)

今天给大家推荐一本超绝的大模型书——《自然语言处理新范式&#xff1a;基于预训练模型的方法》 为什么推荐这本书&#xff1f; 近些年来&#xff0c;以GPT、BERT为代表的预训练模型在自然语言处理领域掀起了一股浪潮&#xff0c;打开了“预训练精调”的自然语言处理新范式…

基于repo同步kylin v10 源及构建本地源

1. 需求和环境 需求&#xff1a;满足离线环境下&#xff0c;可以通过yum获取kylin软件包.我们通过x86的设备同步软件包,然后构建本地源。 客户端&#xff1a;X86笔记本 客户端OS版本&#xff1a;Kylin-Server-10-SP1-Release 2. 同步源到本地 2.1 安装createrepo和reposync等…

OPENAIGC开发者大赛高校组特等奖 | OK简历

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

我开源了:学术论文总结AI-Agent!

为什么搞这个项目&#xff1f; 作为一个天天喜欢读最新论文的人&#xff0c;我也深受其害。打开邮箱&#xff0c;几十篇新推送的论文排队等我去点开阅读&#xff1b;好不容易点进去了&#xff0c;还得慢慢啃英文&#xff0c;最后还得写总结……嗯&#xff0c;太痛苦了。所以&a…

ELK预警方案:API+XXLJob

目录 步骤一&#xff1a;出一个接口&#xff0c;接口内查询出10分钟内是否有异常信息 步骤二&#xff1a;XXLJob中设置预警的频率 步骤三&#xff1a;在重要的业务处输出指定格式日志即可 步骤一&#xff1a;出一个接口&#xff0c;接口内查询出10分钟内是否有异常信息 {&qu…

Xshell官网免费版下载

首先打开官网地址&#xff1a;NetSarang Homepage CN - NetSarang Websitehttps://www.xshell.com/zh 然后划到下拉框最下方找到---家庭/学校免费&#xff1a; 打开后直接下载就好了&#xff1a; 完成之后得到&#xff0c;然后傻瓜式安装就可以&#xff0c;安装路径可根据所需…

【电力系统】清除故障后电力系统的摆动曲线

摘要 电力系统在故障清除后通常会经历暂态过程&#xff0c;表现为发电机转子角度的摆动曲线。本文通过仿真分析了故障清除后电力系统的摆动曲线特性&#xff0c;研究了不同类型故障对摆动曲线的影响。结果显示&#xff0c;系统在清除故障后会产生不同幅度和频率的摆动&#xf…

存储课程学习笔记8_spdk的安装以及简单demo测试

已经对相关的基础概念有一定的了解&#xff0c;比如裸盘&#xff0c;文件系统&#xff0c;读写相关裸盘&#xff0c;裸盘挂载使用&#xff0c;内核插入文件系统的方式&#xff0c;相关操作io的库或者函数&#xff08;io_uring, readv&#xff0c;writev, mmap等&#xff09;&am…

张驰咨询:打造精益生产高手的摇篮,企业竞争力倍增器!

精益生产培训机构在推动企业转型升级、提升竞争力方面发挥着不可替代的作用。它们通过系统化的培训&#xff0c;将精益生产的核心理念、工具和方法传授给企业及其员工&#xff0c;助力企业实现生产效率的飞跃、成本的有效控制以及产品质量的显著提升。 一、精益生产培训机构的作…

一文搞懂Maven的使用:下载、配置、阿里云私服、IDEA配置

Maven是什么&#xff1f; Maven是一个项目管理工具&#xff0c;其核心是一个项目对象模型&#xff08;POM&#xff1a;Project Object Model&#xff09;&#xff0c;通过这个模型可以管理项目的构建、报告和文档。Maven还包含了一套标准的集合、项目生命周期、依赖管理系统以…

代码随想录算法训练营第27天|455. 分发饼干、376. 摆动序列、53. 最大子数组和

目录 455. 分发饼干&#xff08;总出问题&#xff0c;需要多次写&#xff09;1、题目描述2、思路3、code4、复杂度分析5、超级无敌一句话总结 376. 摆动序列1、题目描述2、思路4、复杂度分析 53. 最大子数组和1、题目描述2、思路3、code4、复杂度分析 455. 分发饼干&#xff08…

无人机之伯努利定律

无人机的伯努利定律是解释无人机飞行原理的关键理论之一&#xff0c;它主要阐述了流体&#xff08;如空气&#xff09;在流动过程中速度与压力之间的关系。以下是对无人机伯努利定律的详细解释&#xff1a; 一、伯努利定律的基本原理 伯努利定律是流体力学中的一个基本原理&am…

初识时序数据库InfluxDB

最近项目开发中,需要记录时间序列的日志信息,InfluxDB 刚好契合。于是准备研究一下,发现已经有整理很好的文档,以下两篇觉得很好,入门开发可以参考一下。 因为项目是用C#开发的,因此,简单介绍一下C#开发中,InfluxDB的API使用。 1.简介 InfluxDB是一个由InfluxData开发…

18、Gemini-Pentest-v1

难度 中 &#xff08;个人认为是高&#xff09; 目标 root权限 一个flag 靶机启动环境为VMware kali 192.168.152.56 靶机 192.168.152.64 信息收集 突破点大概就是web端了 web测试 访问主页直接就是目录遍历 不过进去后是一个正常的网页 简单的试了几个弱口令无果继续信息…

什么是HTTPS协议?

HTTPS协议&#xff08;Hypertext Transfer Protocol Secure&#xff09;即安全超文本传输协议&#xff0c;是互联网上进行安全通信的一种重要协议。它是在HTTP&#xff08;Hypertext Transfer Protocol&#xff09;协议的基础上增加了安全性的要求&#xff0c;通过SSL&#xff…

ffmpeg面向对象-rtsp拉流相关对象

目录 1.AVFormatContext类。1.1 概述1.2 构造函数1.3 oopc的继承实现 2. AVInputFormat 类。2.1 多态的实现 3.所用设计模式3.1模板模式3.2 工厂模式&#xff1f; 3.3 rtsp拉流建链 4.this指针5.小结6.rtsp拉流流程 1.AVFormatContext类。 1.1 概述 用户看到的是AVFormatCont…

精益管理|Toyota Kata 是什么意思?

丰田套路是一种培养持续改进习惯的系统方法&#xff0c;也是精益管理&#xff08;CLMP&#xff09;中的一套方法。“Toyota Kata”一词来自精益专家 Mike Rother 的管理书籍《Toyota Kata&#xff1a;Managing People for Improvement, Adaptiveness, and Superior Results》。…

2024/9/11 小型PLC典型应用2:伺服canlink配置、指令、应用

下面这个指令需要设置伺服的急停方式&#xff08;例如&#xff1a;惯性停机、急停等等&#xff09; 通讯故障步骤排查 1&#xff1a;接线问题 2&#xff1a;配置问题&#xff08;波特率.....&#xff09;

安卓13允许app启动服务 android13允许应用启动服务 无法启动服务 Background start not allowed: service

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 android13应用启动服务,有些应用会被禁止启动服务,开启的服务会失败,这是高版本的android的特性,我们需要更改下frameworks的代码。 2.问题分析 查看下logcat信息 B…

百元榜哪个牌子的蓝牙耳机最好用?四大闭眼入高性价比耳机推荐!

蓝牙耳机的普及率在近年来越来越高&#xff0c;行业发展十分迅猛&#xff01;在很多好的品牌涌现的同时&#xff0c;也有很多的品牌质量不过关&#xff0c;货不对版&#xff0c;使得很多的人以为&#xff0c;百元的就没有好用蓝牙耳机&#xff0c;不少小伙伴在选择蓝牙耳机的时…