Oracle的Hint是用来提示Oracle的优化器,用来选择用户期望的执行计划。在许多情况下,Oracle默认的执行方式并不总是最优的,只不过由于平时操作的数据量比较小,所以,好的执行计划与差的执行计划所消耗的时间差异不大,用户感觉不到而已。但对于书写操作大数据量的SQL而言,其SQL的书写则需要先了解一下执行计划是否最优或满足生产需要。通常当从开发环境迁移到生产环境下时,往往会出现此类情况。
本博客介绍Oracle SQL调优的一种常用也是很实用的方法,也即/*+no_unnest */和/*+ unnest*/,介绍Oracle 的 /*+unnest */ 、 /*+ no_unnest */之前,先介绍一下Hint。
在Oracle 10g中,CBO 可选的运行模式有2种: (1) FIRST_ROWS(n) (2) ALL_ROWS – 10g中的默认值
碰巧看见了dba-oracle上的一个问题,算是基础性问题,
嘉宾介绍: 在SQL优化中,除了可以通过修改参数的方式干预优化器工作外,还可以使用提示的方式进行干预,而且这种方式更加精准、不影响其他SQL,故使用场景更加广泛。 1. ALL_ROWS 说明: AL
Oracle的强大之处就在于他能总帮助让你选择正确的执行计划,即使你给了它错误的指示。
最近在调研业界其他数据库中 SQL Hint 功能的设计和实现,整体上对 Oracle、Mysql、Postgresql、 Apache Calcite 中的 SQL Hint 的设计和功能都进行了解,这里整理一篇文章来对其进行梳理,一是帮助自己未来回顾,加深自己的思考,二是也能帮助大家更好的了解数据库 SQL Hint 的实现原理。
编辑手记:在前一段,一篇智能数据库优化的论文引起广泛的关注,其实在 Oracle 数据库中,已经引入了大量自动化和智能化的方法去进行自动调节,包括在 SQL 层面的智能诊断分析和建议。 张大朋(L
email:lhui@hndldz.com & yuqishow@qq.com
何剑敏 Oracle ACS华南区售后团队,首席技术工程师。多年从事第一线的数据库运维工作,有丰富项目经验、维护经验和调优经验,专注于数据库的整体运维。 今天分享一则bug导致的SQL执行不稳定的案例。 SQL执行的时间,在正常情况下应该是稳定的。如果第一次快,第二次慢,那么可能就是由于cardinality feedback的缘故,我们可以设置”_OPTIMIZER_USE_FEEDBACK”= false来规避。但是这次遇到的问题却是执行过程两快一慢,执行过程是慢->快->快->慢->快->快->
基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。
Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。
半连接(Semi Join)是一种特殊的连接类型,当做子查询展开时,Oracle经常会把那些外部WHERE条件为EXISTS、IN或= ANY的子查询转换为对应的半连接。半连接分为嵌套循环半连接(Hint为:NL_SJ)、排序合并半连接(Hint为:MERGE_SJ)和哈希半连接(Hint为:HASH_SJ),不过在新版本数据库里,都倾向于使用哈希半连接。不过哈希半连接也有一些限制条件,例如,只能使用等值连接、不能使用GROUP BY、CONNECT BY、ROWNUM等限制条件。在执行计划中若有关键字“HASH JOIN SEMI”,则说明Oracle使用了哈希半连接。示例如下所示:
整理工作中用到的Hint,不定时更新,Hint是oracle早期因为oracle优化器还不是很完善加上去的,可以辅助oracle优化器,Hint 是Oracle 提供的一种SQL语法,常用于SQL调优,通过Hint强行改变Oracle的执行计划,从而实现sql调优
环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 目录: 一、 创建外部表
OUTLINE的原理是将调好的执行计划(一系列的Hint)保存起来,然后使用该效率高的执行计划替换之前效率低下的执行计划,从而使得当系统每次执行该SQL时,都会使用已存储的执行计划来执行。所以,可以在不改变已有系统SQL的情况下达到改变其执行计划的目的。OUTLINE方式是通过存储Hint的方式来达到执行计划的稳定与改变。当发现低效SQL之后,可以使用Hint优化它,对于SQL代码可以修改的情况,直接修改SQL代码加上Hint即可。
在上周恩墨微信大讲堂的讨论中,几个有趣的视图跃入我们的视野,可以分享给大家。 在Oracle 11g中,新增的视图V$SQL_HINT记录了Oracle数据库中的可用Hint及其历史。 如果串起来,这几个视图的关系极大:V$SQL_FEATURE,V$SQL_FEATURE_HIERARCHY,V$SQL_HINT,通过这几个视图可以了解Oracle的SQL特性,继承关系,以及可用Hint及启用版本等。 v$sql_hint这个视图来自于底层的x$qksht表,其创建语句如下: SELECT INST_ID
在我发布了使用coe_load_sql_profile.sql脚本可以解决生产系统执行计划突然变差的文章后,第二天刚好又看到一篇文章:《执行计划:Oracle的Profile特性与SQL执行计划的稳定性》,文章专门对sql profile做了深入的介绍,对了解SQL profile的原理很有帮助。因为撰写人和转发者都是业内大拿,粉丝众多,看了那篇文章的人应该非常多,因此有必要对那篇文章的一个小瑕疵加以纠正,即“SQL profile不能固定执行计划”这个结论是不准确的,只是在某种测试条件下的一种结果。
反连接(Anti Join)也是一种特殊的连接类型,通常用于从一个表中返回不在另一个数据源中的数据行。当做子查询展开时,Oracle经常会把那些外部WHERE条件为NOT EXISTS、NOT IN或<> ALL的子查询转换成对应的反连接。反连接分为嵌套循环反连接(NESTED LOOPS ANTI,Hint为:NL_AJ)、排序合并反连接(MERGE JOIN ANTI,Hint为:MERGE_AJ)和哈希反连接(HASH JOIN ANTI,Hint为:HASH_AJ)。示例如下所示:
编辑手记:在Oracle数据库中,版本变化带来的一大挑战就是SQL执行计划的稳定性,为此Oracle经历了从Outline到Profile的特性演进,本文带大家一起来了解一下Profile的特性和使用。 SQL Profiles 是 Oracle 10g 引入的一项新特性,并且在11g中被广泛的使用,其核心功能可以说是 Outlines 的进化。Outlines 能够实现的功能 SQL Profiles 也完全能够实现,而 SQL Profiles 具有 Outlines 不具备的优化,个人认为最重要的有2
特别介绍给大家Oracle Hints之前,让我们知道下Oracle Hints什么,然后好Oracle Hints,我们希望实际。基于成本的优化器是很聪明,在大多数情况下,将选择正确的优化,减少DBA负担。
在向大家具体介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家实用。基于代价的优化器是非常聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了非常差的运行计划,使某个语句的运行变得奇慢无比。
对于没有收集统计信息的表,Oracle为了能够得到相对准确的执行计划,会在执行SQL之前对SQL语句涉及到的表做动态采样(Dynamic Sampling,从Oracle 11.2.0.4开始称之为Dynamic Statistic)。
作者介绍 赵全文 就职于太极计算机股份有限公司,在中央电化教育馆做Oracle DBA的驻场运维工作。具有3年左右的Oracle工作经验,目前擅长Oracle数据库的SQL脚本编写、故障诊断和性能优化,并且乐于分享Oracle技术。 一般在DBLINK的SQL语句中,将调用远程表的in-line view结果集返回的数据尽量减少,进而达到通过网络传输的数据减少的目的,而且也不会将数据传输的资源消耗在大量的网络等待事件上。在Oracle中这样的等待事件是:SQL*Net messa
最近这一周以来,生产环境像是得了重病的病人一样,小问题没有修好,大问题不断。IO的等待极为严重。数据库的负载达到了几十倍,上百倍。 weblogic和tuxedo在很大程度上都受到了影响,导致业务响应极为缓慢。 在排查了中间件部门,数据库,存储,网络,操作系统等各个层面,也发现了存储的一些小问题,问题比较大的就是数据库这边的一个sql语句,每执行一次需要7分多钟,按理说这种类型的语句执行7分钟左右可能不是太大的问题。但是了解到这个sql语句在所有的中间件层面都需要频繁的发送sql请求,比如有20个weblg
张中靖 云和恩墨技术专家,软件研发总监 我们先来听一个【老木匠和小木匠的故事】 同样做柜子,老木匠做的是两面光,柜子内外摸起来一样光滑、不扎手;而小木匠做的,大多是外面光滑,里面不能细看。 乔布斯可以算是一位老木匠了,他一生中追求的完美主义,淋漓尽致地表现在了苹果的一系列产品中。《史蒂夫·乔布斯传》有这样的描述: 乔布斯从父亲身上学到,充满激情的工艺就是要确保即使是隐藏的部分也被做得很漂亮。这种理念最极端也是最有说服力的例子之一,就是乔布斯会仔细检查电路板,电路板上是芯片和其他部件,深藏于麦金塔的内部,
使用 no_unnest hint可以让执行计划产生filter,即不展开,但一般情况下使用unnest hint无法消除filter。
据孔老先生说,茴香豆的茴字有四种写法,那oracle的分页查询又有多少种写法呢? 分页查询,其实本质上就是topN查询的变种, 如果把topN的一部分结果集去掉,就变成了分页. topN的基本写法,
查下来一看hash_value的值是一样的,说明不是绑定变量的问题,而是version count过多,而且是五分钟一次,接下来我们来分析原因
sharding-jdbc对SQL解析的源码主要在下图所示parsing模块中,由下图可知SQL解析主要分为两部分:lexer和parser。lexer就是本文需要分析的词法分析:
序言 数据库的优化方法有很多种,在应用层来说,主要是基于索引的优化。本次秘笈根据实际的工作经验,在研发原来已有的方法的基础上,进行了一些扩充,总结了基于索引的SQL语句优化的降龙十八掌,希望有一天你能用其中一掌来驯服客服业务中横行的‘恶龙’ 总纲 建立必要的索引 这次传授的降龙十八掌,总纲只有一句话:建立必要的索引,这就是后面降龙十八掌的内功基础。这一点看似容易实际却很难。难就难在如何判断哪些索引是必要的,哪些又是不必要的。判断的最终标准是看这些索引是否对我们的数据库性能有所帮助。具体到方法上,就必须熟悉数
在确定调优会话的目标后,例如,将用户响应时间从三分钟缩短到不到一秒,问题就变成了如何实现此目标。
小编寄语 我们都知道,对于通过dblink关联本地表和远程表,远程表的索引个数一般不超过20个,对其本身不会有什么影响。但是当索引个数超过20个的时候,又会发生什么变化呢? 昨天同事参加了一个研讨会,有提到一个案例。一个通过dblink查询远端数据库,原来查询很快,但是远端数据库增加了一个索引之后,查询一下子变慢了。 经过分析,发现那个通过dblink的查询语句,查询远端数据库的时候,是走索引的,但是远端数据库添加索引之后,如果索引的个数超过20个,就会忽略第一个建立的索引,如果查询语句恰好用到了第一个建立
先来看一本书(见下图),作者是业界鼎鼎有名的大师级人物Richard Niemiec,从9i、10g到现在的11g,这个优化系列的书,每一本都是厚厚的千页左右,可见大师的称号不是浪得虚名。下面这部最近几年翻译出版的11gR2,书的译者也都是老虎刘非常熟悉和敬佩的几位老朋友,当时也都在甲骨文供职。其中主要的3位译者,杨中是老虎刘在RWP时的老板,朱波和吕学勇在进入甲骨文之前也和老虎刘在同一家公司。这是一本全面介绍Oracle性能相关知识的好书,值得推荐。
Oracle数据库中优化器(Optimizer)是SQL分析和执行的优化工具,是Oracle数据库中内置的一个核心模块。优化器的目的就是为了得到目标SQL的执行计划。Oracle数据库里的优化器又分为RBO(rule-Based Optimizer,基于规则的优化器)和CBO(Cost-Based Optimizer,基于成本的优化器)这两种类型。从Oracle 10g开始,Oracle数据库默认都是基于CBO的优化方式。
MySQL Hints是一组特殊的注释或指令,可以直接嵌入到SQL查询中,以改变MySQL优化器的默认行为。这些Hints通常被用于解决性能问题,或者当开发者比优化器更了解数据分布和查询特性时,来指导优化器选择更好的查询计划。
oracle的online document里面,对use_hash的hint语法是这样描述的:
经常见到有人在QQ群和微信群发SQL代码和(或)简单执行计划的截屏咨询优化问题,如果是比较简单的SQL,也没问题; 如果是稍微复杂一点的SQL, 特别是一些根因分析类问题, 建议收集尽可能详细的信息.
SQL Profile就是为某条SQL语句提供除了系统统计信息、对象(表和索引等)统计信息之外的其它信息,比如运行环境、额外的更准确的统计信息,以帮助优化器为SQL语句选择更适合的执行计划。SQL Profile可以说是Outline的进化。Outline能够实现的功能SQL Profile也完全能够实现,而SQL Profile具有Outline不具备的优化,最重要的有两点:①SQL Profile更容易生成、更改和控制。②SQL Profile在对SQL语句的支持上做得更好,也就是适用范围更广。
在接口里可以写一个 “ 默认方法 ”,它可以在 不强制必须实现这个方法,从而很方便的往现存接口中添加新的方法。
我最初是一个Oracle开发者,我喜欢它的结构化查询语言,一年后,我意识到SQL并非Oracle的专有。 作为70年代Sequel标准的一个分支,SQL走向成熟并且成为全世界数据库用户广泛应用的语言。其一是因为SQL简单(基于英语词汇),同 时它又能解决很多复杂的问题。SQL是当代最容易学习和使用的语言之一。ANSI-SQL标准几乎被所有主流关系型数据库所接受,如Oracle,DB2 和SQL Server,当客户决定从一个数据库迁移到另一个时,它极大地提高了可移植性。 在接触ETL工具前,将近五年的时间
网上有很多SQL优化的案例, 我本人对这方面特别感兴趣,今天就带着大家一起来学习一下专家是如何优化SQL的.
前面2篇文章讲到分页性能优化相关知识点,但并没有介绍如何找出系统中TOP SQL、对于如何清理SQL缓存执行计划(比如走错执行计划,存在数据倾斜的情况)、Mongo如何针对不同查询语句选择执行计划等相关知识点.
作者介绍 邓秋爽 云和恩墨技术专家,擅长于SQL tuning、troubleshooting 系统运行过程中可能遇见各种各样的性能问题,如果仅仅是当前系统的性能问题,我们可以通过查询Oracle的数
2. Index FFS只能通过CBO(Index hint强制使用CBO)获得。
最近由于业务上的需求,一张旧表结构中的数据,需要提取出来,根据规则,导入一张新表结构中,开发同学写了一个工具,用于实现新旧结构的transformation,
数据倾斜即表中某个字段的值分布不均匀,比如有100万条记录,其中字段A中有90万都是相同的值。这种情况下,字段A作为过滤条件时,可能会引起一些性能问题。 本文通过示例分享部分场景的处理方法 未使用绑定变量 使用绑定变量 几种特殊场景 1 测试环境说明 数据库版本:ORACLE 11.2.0.4 新建测试表tb_test: create tablescott.tb_test as select * from dba_objects; 创建索引: create indexscott.idx_tb_test_01
cl_abap_char_utilities=>horizontal_tab — 09 TAB符
领取专属 10元无门槛券
手把手带您无忧上云