执行计划(CBO)

CBO原书代码 CBO学习代码 Jonathan Lewis编写 立即下载

导致不使用CBO而使用RBO的三个原因:
1.optimizer_mode设置为rule或optimizer_goal设置为rule
2.查询中包含有rule提示.
3.查询的所有表都没有被分析过,并且查询不包含任何提示.

RBO的工作方式:
    RBO在决定SQL的执行计划时,只使用少量信息:
        SQL文本.
        SQL的FROM后面的基本信息,如表,簇,视图,参考的其他字段的数据类型.
        与SQL相关表上的索引.
        数据字典信息只对本地数据库有用. 如参考远程数据库,数据字典信息对RBO无效.
    簇的缺点超过它的优点.
    很少在应用中使用簇.    
   
结论:
    RBO只考虑少量可能的访问方式.
    对RBO来说,索引总是好的,即使有的时候索引不一定好.
    RBO经常使用没有意义的窍门来解释SQL,为什么FROM后面的顺序会与次相关?!很多人借解释了CBO的不稳定性,但是有多少次索引重建后RBO的执行计划因此改变了呢.
    100%的命中率意味着没有逻辑IO导致物理IO,这清楚地解释了一点:缓存命中率对优化执行计划没有什么意义. 减少执行,减少逻辑IO的数量才是更好的目标.

    Oracle最后不得不抛弃IO. 自从介绍RBO到CBO出现并很好地应用于生产系统,RBO运行了7年之久.

   
CBO的工作原理:
    CBO是一个数学处理器,它使用公式去计算SQL的成本. 成本本质上被转换为物理IO,逻辑IO在Oracle的SGA的Buffer Cache中被完全处理.
    CBO使用更多的可能的访问方式,它计算每个可能的访问方式的逻辑IO的数量,然后简单地选择最低成本的一个执行方式.
    RBO是线性的设计,一步步地做决定,先最决定,然后下个决定以该决定为基础,初始决定对最终的结果影响很大.

  
什么情况下可能出错?
    CBO只是选择执行计划中成本最低的一种,至少两种情况可能会出错:
    1.可能接收到错误的数据,
    2.一个或多个公式没有包括重要的因子或是错误的.
    这两个问题贯穿Oracle7始终.

    Oracle7中,analyze命令存在很多BUG,到了Oracle8中,很多BUG被修复了. Oracle 8i中DBMS_stats包比analyze命令更好的统计信息. 剩下的就是对CBO使用的计算成本的公式进行细微的修正了.

Cost是什么意思?
    CBO计算的成本主要由物理IO组成. 实际的公式:IO+CPU/1000+NetIO*1.5
    该公式中,IO表示物理IO请求, CPU描述逻辑IO请求, NetIO描述通过数据库连接到远程数据库的逻辑IO请求. 这以为着物理IO是最"昂贵"的组成部分. 从中也可以看出,分布式数据库应用会有更高的COST. 逻辑IO和物理IO的区别是什么?  前者是对缓存在Oracle SGA的Buffer Cache中的数据块的访问.  后者是从Oracle系统中取得的不缓存在Buffer Cache的数据块的请求数.  CBO计算所有可能的执行计划的物理IO的请求数. 排除不是最低的执行计划.
   
Oracle IO规则:
    Oracle不访问行,而是访问包含行的数据块, 不是去访问磁盘,而是首先去查Oracle SGA中的Buffer Cache内存中的块(逻辑读). 逻辑读:consistent gets和db block gets(current gets).  一致读是提取的特定版本或时间点的SQL数据块, db block gets是当前的时间点提取的数据块,一般是修改数据如插入、更新、删除。
    v$sysstat或v$sesstat中不会有“logical read”,只有“consistent read”和"db block gets" ,将两者相加就是了。
    如果在Buffer Cache中找到了数据块,则系统就使用找到的数据块,如果没有找到,系统执行物理读,将块读到Buffer Cache中。
    如果一个服务器进程正在执行一个物理读,而另一个进程执行逻辑读时,没有发现缓存中有数据块,那么该进程也会去进行一个物理读吗?不,第一个进程在发现数据块没有在缓存中时,在实际执行物理读之前会预先分配一个缓冲器给该块,然后锁定缓冲器并发送物理IO请求,第二个进程试图进行逻辑读,而缓冲器被锁定,则会POST一个"buffer busy wait"的等待事件并等待该块可用,减少没有必要的IO。
   

在cache buffers chain上工作
    Buffer Cache是一个填满缓冲块的高速缓冲存储器,由LRU(least recently used)运
算法则管理,使用该法则,最经常被访问的缓冲块被放在链表的MRU(most recently used)端, 新读到缓冲存储器中的块被放置在MRU端,逻辑读时,他们被移到MRU列表一端,如果块没有被访问,它就会逐渐地向LRU端移动。当它达到LRU端末的时候,新读到的块就会覆盖该缓冲块,该块也就掉离列表的LRU.  Oracle8i中使用了中点插入算法来减少因块移出列表特别是“热”块移动到列表的MRU端的latch处理。

两类IO:
    Oracle读数据文件有两中类型的IO:
    1.单块,随机访问读取,通常是与索引访问有关的(该IO请求发生时,产生等待事件db file sequential read).
    2.多块,顺序访问读取,通常与全表扫描访问有关(该IO请求发生时,将产生db file scattered read等待事件),但是可能与排序和并行查询(等待事件:direct path read).
    这两种IO类型规则十分相似,进程需要数据块时,首先检查Buffer Cache,如果块存在,就使用它,并且把它移动到LRU链的MRU端。如果块不存在,就从磁盘上的数据文件读取放到缓冲区中,并将它防止到LRU链的MRU端。
    不可避免地,每个新读到的块都将被放置到LRU链的MRU端,当前面的块被LRU链的LRU端时,最后被推出LRU链或被覆盖。全表扫描时,需要扫描的块大于Buffer Cache时,将完全刷新Buffer Cache的内容。

Oracle中的缓存IO:
    Oracle7中一个改变来防止这种缓冲区被刷新的情况(cache flushing effect), 首先,多块顺序访问的全表扫描的处理和LRU的算法是不同的,当全表扫描时,读到的块将被防止到LRU链的LRU端. 索引扫描的单块读没有改变,继续被放置在LRU链的MRU端. 全表扫描的数据块计划会立刻被覆盖,除非这些块很快被再次访问(将被移动到MRU端).
    全表扫描的逻辑读一般很在Buffer Cache中找到需要的块,因此,全表扫描总是表现为大量的物理读.  但是被全表扫描重新访问的块有多块的频率? 大多数情况下很少. 所以Oracle7的设计者公认地允许块很快被覆盖,同时保留下Buffer Cache的原来真实内容.
    但是小表没有必要每次物理读,于是他们设计Oracle7时将小表的全表扫描块防止在LRU链的MRU端,作为特例,加速对小表全表扫描的访问.  参数SMALL_TABLE_THESHOLD存储了可以使用的数据块数, 默认db_block_buffers的2%. Oracle7前没有该参数.  有人将该参数设置过大,已存储更多的小表, 但是这样将导致buffer cache可用变小,反问容易出现不希望出现的cache flush.

Oracle7 + 版本中的IO:
    small_table_threshold已经被设置为隐含参数_small_table_threshold.考虑到开发者可能会将某表驻留在Buffer Cache中, 所以在建表或修改表的语句中设置了cache和nocache关键字, 设置为cache的表块将被防止在LRU链的MRU端.
    考虑到可能有大量的表缓存,所以Oracle设置一个参数:CACHE_SIZE_THRESHOLD,超过该参数设置的数量的数据块数的表,将不能被cache到buffer中. 该参数默认Buffer Cache的大小的10%,可以根据需要进行更改.

    索引扫描的块总是放在LRU链的MRU端. 标记为cache的表并且块要比cache_size_threshold参数设置的小时,该表会处理LRU链的MRU端. 全表扫描的大表块将被在LRU链的LRU端.

    全表扫描的几乎每次逻辑读都将导致物理读,这是正常的,也是有利的. 全表扫描通常Buffer Cache的命中率只有20%设置更少,常是1-5%. 意味着除了少数逻辑读外,都需要物理读. 索引扫描通常表现膸很高的Buffer Cache命中率95%或以上.


OPTIMIZER_INDEX_COST_ADJ的调整
    系统运行一段时间后(需要将参数timed_statistics设置为TRUE),查询v$system_event,db file sequential read和db file scattered read事件的average_wait字段分别显示的是索引扫描和全表扫描的平均等待时间,单位为1/100秒.
可以将OPTIMIZER_INDEX_COST_ADJ 参数设置为(前者/后者)*100
   

OBS技术深度剖析:从开源直播工具到专业制作引擎的进化之路 本文深入剖析了开源直播软件OBS的技术架构与发展历程。从2012年诞生至今,OBS已成长为直播领域的事实标准,其成功源于模块化设计和开源协作模式。文章详细解析了OBS的核心技术:1) 分层架构与插件系统,2) GPU加速的渲染管线,3) 智能音频处理,4) 多平台编码优化。同时探讨了虚拟摄像头、浏览器源等高级功能的实现原理,并提供了性能优化方案和硬件配置建议。随着AI、WebRTC等新技术发展,OBS将持续引领实时内容创作工具的创新,为开发者和创作者提供更强大的技术支持。 阅读详情

相关推荐

unity制作交互视频/互动视频

unity制作交互视频/互动视频 思路 1.先让unity播放视频 2. 视频播放结束后,视频暂停,按钮出现 3.按钮跳转下一个视频 视频播放 先创建UI-Raw Iamge 在Raw Iamge 挂载组件 Video Player 接着挂载视频播放的脚本 using UnityEngine; using UnityEngine.UI; using UnityEngine.Video; publi...

weixin_45588911的博客 8423

解读CBO执行计划

Cost:CBO赋予查询计划的每个步骤的成本。CBO通过对相同查询生成许多不同的运行计划/路径进行工作并赋予每个步骤一个成本。具有最低成本的查询计划获胜。Card:Card是基数(Cardinality)的缩写,它是特定的查询计...

climb1111的博客 379

[Github]GitHub 2FA快速安全配置全攻略

GitHub强制要求用户启用双重身份验证(2FA)以提升代码安全。本文详细介绍了2FA的三种实现方式:TOTP应用验证(推荐)、SMS短信验证(备用)和硬件安全密钥(最安全),并提供了配置指南。特别推荐使用在线工具2FA.run快速测试TOTP功能。文章还涵盖恢复代码管理、企业级2FA策略制定以及常见问题解决方案,如时间同步问题、多设备同步等。通过强制2FA、定期审计和建立安全事件响应流程,开发者可构建更安全的代码管理体系。

冰茶的博客 2620

oracle中CBO的不稳定性

oracle中的CBO是一个智能化的程序,他会根据表内数据或者索引的不同,而执行不同的解释计划,在有时候他会很好。比如说:如果一个表有1000万条记录,而字段A中=1的数据有500万条,字段A上面有一个普通索引,当我们做下面查询...

208

川崎机器人 AS语言基础运动指令表

    功能简介 动作方式 参考坐标系 位置特性 X,Y,Z 角度特性 O,A,T 指令格式(距离单位毫米,时间单位秒,角度单位度 示例1 示例2 运 动 指 令 JMOVE 以关节移动到目标点 关节移动方式 基础坐标系 不受控 伪随机动作 JMOVE 目标点 JMOVE #yd JMOVE put1 LMOVE 以直线移动到目标点 直线移动方式

喜欢自学并分享经验的技术宅 9350

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3338

基于CBO的执行计划简介

基于CBO的执行计划简介 一、生成执行计划的几种方式 1、explain plan for sql语句;       select * from table(dbms_xplan.display); 2、sqlplus中set autotrace on; 3、toad中Ctrl+E       pl/sqldeveloper中F5 二、SQL优化实质上指的是分析执行计划,确定

醉爱梁静茹 2275

【机器人】线性方程最小二乘解法对机械臂DH参数进行标定

1.前言 看了一篇文章,觉得里面的DH参数标定法讲的很清晰,便使用Matlab复现了一下,效果还可以,特写此文记录。 2.原理 2.1.误差最佳值的最小二乘计算 有研究结果表明:几乎95%的机器人位置误差都是由机器人内部运动学的不准确描述引起的,所以对DH模型参数进行标定是很有必要的。 DH参数物理含义:选自《机器人学、机器视觉与控制-Matlab基础》 当DH参数确定后,我们...

要恰饭得嘛 1万+

基于CBO的SQL优化和Oracle实例优化

SQL优化是数据优化的重要方面,本文将分析Oracle自身的CBO优化,即基于成本的优化方法。Oracle为了自动的优化sql语句需要各种统计数据作为优化基础。外面会通过sql的追踪来分析sql的执行过程,消耗的资源信息。对于数据库的性能问题往往是在系统部署一段时间之后出现的,即大量用户开始使用该系统,系统的数据处理量和各种计算复杂性增加的时候,这个时候往往会追溯到系统的初始设计阶段,所以我们还是

朱培(知浅_ZLH) 4616

YOLOv8【项目实战四】遥感图像目标检测:应对特殊场景的挑战,如何处理遥感图像通常具有的大尺寸、多尺度、方向多变等特点,并对 YOLOv8 进行相应调整(含源码)

遥感图像目标检测优化策略 核心挑战 图像尺寸大:遥感图像通常达数万像素,直接缩放导致小目标丢失 多尺度目标:同一图像包含几十像素的小目标和跨图像的大目标 方向多样性:目标360度任意旋转,水平框检测效果差 优化解决方案 滑动窗口分块处理: 采用1024x1024窗口大小 设置20%-30%重叠率防止边界漏检 全局坐标转换实现检测结果拼接 多尺度特征融合: 改进FPN结构增强小目标检测 自适应感受野处理不同尺寸目标 上下文信息聚合提升检测精度 旋转目标检测: 引入旋转边界框表示 角度预测分支增强方向感知 旋转

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 617

科研级实战】YOLOv11 pose部署至RK3588全流程:让姿态估计模型在边缘端毫秒级运行,我来帮你突破人体行为分析落地壁垒

在智慧安防人体行为分析场景中,基于YOLOv11 pose的模型在云端推理单帧耗时150ms,硬件成本超15000元;经本方案部署到RK3588后,单帧推理耗时降至30ms,硬件成本仅4000元,且关键点检测准确率高达93%以上。在运动姿态评估场景,同款技术路径使模型边缘端推理速度提升6倍,姿态分类精度达95%。这意味着,你也能让自己的姿态估计模型在边缘设备上实现的工业化落地,接下来让我们开启从模型训练到端侧部署的实战征程。

m0_71589036的博客 223

SparkSQL_Spark SQL运行流程及性能优化:RBO和CBO

基于代价的优化器(Cost Based Optimizer,CBO)已经包含了Join重排的优化规则,join重排通过影响中间结果、具体join算法,从而影响join的执行效率Join的顺序影响中间结果的数据量,决定了Join的执行效率假如A,B,C的数据量各自是1000条记录,如果A ⋈ C的数据量是1条记录,A ⋈ B是100条记录,显然A ⋈ B ⋈ C的效率低于A ⋈ C ⋈ B,因为前者的中间结果是100条记录,而后者是1条。

迎难而上 525

基于STM32的智能快递柜设计(全部资料)

本文设计了一种基于STM32F407ZGT6的智能快递柜系统,通过模块化硬件设计和软件算法优化,实现了24小时无人值守、温湿度智能调控、远程监控等功能。系统集成OLED显示、GSM通信、舵机控制、超声波检测等模块,存取响应时间≤3秒,识别准确率达99.2%,较传统模式效率提升60%。测试表明系统运行稳定,用户满意度达92%,具有成本低、安全性高、可扩展性强等特点,为智慧物流末端配送提供了创新解决方案。未来可引入AI算法、太阳能供电等功能进一步优化系统性能。

3254968421的博客 586

CBO对于Oracle SQL执行计划的影响

        另一篇关于oracle使用基于成本进行执行计划的文章,可以看出oracle在这方面还是有很多指的改进的地方,必须开发者指定较优的执行计划优化器。所以请大家在遇到性能极差的sql语句时,请尝试根据执行计划寻找耗时的原因。原文(转自:http://www.eygle.com/archives/2004/10/how_cbo_effect_sql_explain01.html)如下C

yq76034150的专栏 2220

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据库CBO执行计划优化器

数据库,CBO, 执行计划,SQL优化,高斯,Gauss

wangchao2679的博客 627

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

故障处理:案例:what?Oracle CBO居然选择cost值高的执行计划

Oracle CBO优化器异常案例:文章记录了一个真实案例,客户在Oracle 11.2.0.4版本中遇到一条SQL在源库执行缓慢但目标库性能良好的诡异现象。分析发现CBO优化器错误选择了COST值更高的执行计划(215K代价),通过INDEX SKIP SCAN访问表而非更优路径。文章提供了SQL文本、错误执行计划及Outline信息,并指出该案例的特殊性在于优化器违背常规选择了成本更高的方案。建议关注博客网站获取更好的代码展示效果,并欢迎读者交流类似案例。

提供数据库技术支持(系统优化,故障处理,安装升级,数据恢复等) 865

oracle执行计划中的基数,一个真实的基数导致CBO选错执行计划!

有很多情况,导致CBO选错执行计划,良好的统计信息在优化当中还是非常有必要的。在其他文章当中简单说过Oracle表之间的连接方式。如果一个表的基数算错,很可能就会走错执行计划。PgSQLSQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT------------------------------------------...

weixin_39651488的博客 365

Oracle CBO选错执行计划的一种场景

测试人员做应用性能测试,反馈有一条SQL语句,之前执行非常快,现在执行时间,明显慢了。   SQL语句非常简单,根据日期字段,检索当日表中记录数, select count(*) from user.tbl where cki_date = to_date('2017-10-10','yyyy-mm-dd');   我们执行一次10053, SQL> alter sessi...

bisal的专栏 1187

约束Constraint引起CBO执行计划变化一例

Oracle优化器经历RBO到CBO的演进过程,其能力已经远远超过“条条大路通罗马”的程度,而进入到智能化程度。那么,我们怎么样规划应用架构、设计数据表和写好SQL,就是我们一直关注的问题。在笔者之前的文章中,一直强调一个...

ciqu9915的博客 145

KingbaseES CBO 优化器原理剖析:统计信息采集、代价模型与执行计划调优

本文深入解析KingbaseES CBO优化器原理,涵盖统计信息采集、代价模型与执行计划调优三大核心内容。文章通过大量SQL示例演示了: 统计信息基础:详细讲解表级、字段级和索引统计信息的组成与自动采集机制,强调统计信息准确性对优化器决策的关键影响。 代价模型原理:剖析I/O成本、CPU成本和内存成本的综合计算方式,展示不同查询条件下索引扫描与全表扫描的成本对比。 执行计划调优:提供常见执行计划问题诊断方法,包括统计信息更新、索引优化和查询重写等实用技巧。

小相探索IT世界 3万+

【Oracle】看懂执行计划之基于成本的优化器(CBO)

基于代价的优化方式(Cost-Based Optimization,简称CBO)   CBO选择目标SQL执行计划的判断原则是成本,从目标SQL的诸多执行计划中选取成本值最小的执行路径为其执行计划,各执行路径的成本值是根据目标SQL中涉及到的表、索引、列等相关对象的统计信息计算出来的,实际反应执行目标SQL所要消耗的I/O、CPU和网络资源的一个估计值。 I/O 把数据从磁盘读入内存时所需代价(Select重点指标) CPU 处理内存中数据所需的代价(排序(sort)、连接(join)操作) 网络资源 网

As before 如初 1557

Oracle收集cbo统计信息,Oracle CBO 统计信息的收集与执行计划的选择

--概要主要总结一下Oracle是如何收集统计信息的是如何选择的,有一些好的Ref可以看看--基本概念首先要明确系统的自动收集机制 如果insert update delete truncate发生的数据量变化大于总记录的10%系统就会自动重新统计信息.如果统计信息为null时系统蚕食OPTOMIZER_DYNAMIC_SAMPLING 能够控制如何进行收集. Hint是 /*+ dynamic_...

weixin_39764487的博客 242

Oracle CBO 案例 1 - 列的最大、最小值对于执行计划的影响

今天遇到了一个与CBO有关的案例。一个表的列的最大/最小值变化后,CBO由于缺少信息(没有重新收集统计信息或者设置列的最大最小值)而导致执行计划出错。[@more@]表: AVLATTRIBVALUESBK索引:IDX_AVLA...

cuanchi6533的博客 304

CBO的相关原理 系列一

CBO的相关原理 CBO在oracle7中被引入,基于数据对象的统计信息(包括数据集的行数,唯一值的个数等等)来计算执行计划的执行成本。随着版本的演化,CBO逐渐完善起来,在9i开始使用系统统计信息(system statistics,系统统计信息的出现是为了估算SQL在CPU方面的消耗)。但是CBO仍然存在一些缺陷,通过了解CBO的一些相关原理,其缺陷大家也就很容易理解了,从而也会明白

woqutechteam的博客 1448

CBO对于Oracle SQL执行计划的影响(之一)

为什么80%的码农都做不了架构师?>>> ...

weixin_34194551的博客 338

Oracle CBO 统计信息的收集与执行计划的选择

Oracle CBO 统计信息的收集与执行计划的选择 http://www.cnblogs.com/buro79xxd/archive/2010/03/29/1699303.html --概要 主要总结一下O...

csh1951914的博客 108
上一篇: 专注的力量 敬业的精神
下一篇: 系统级触发器
dinya2003
博客等级 码龄23年 48粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值