返回顶部
首页 > 资讯 > 数据库 >Oracle 查询转换初探
  • 963
分享到

Oracle 查询转换初探

2024-04-02 19:04:59 963人浏览 泡泡鱼
摘要

概述oracle查询转换器的作用是把原始sql重写为语义相同的语句,目的是为了获得更高效的sql。查询转换主要有四种技术:子查询展开,视图合并,谓词推入,星型转换。了解查询转换是掌握SQL优化的基础,本文将

概述

oracle查询转换器的作用是把原始sql重写为语义相同的语句,目的是为了获得更高效的sql。
查询转换主要有四种技术:子查询展开,视图合并,谓词推入,星型转换。
了解查询转换是掌握SQL优化的基础,本文将对这四种技术做一些简单的介绍。

子查询展开

子查询展开是指优化器不再把子查询作为独立的单元处理,而是转换成等价的join方式。转换有两种方式:一是将子查询的结果集作为视图,与外层表或视图做join;二是将子查询中的表或视图拆出来,与外层表或视图做join。子查询前包含以下条件可以被展开:

·         any(= any和in等价)

·         all(<> all和not in等价)

·         exists

·         not exists

single row条件(where后面接=,<,>,<=,>=等条件)
子查询展开的例子:
 Oracle 查询转换初探

最终转换的语句:
 Oracle 查询转换初探

可以看到子查询中的dept表被拆出来,与外部查询块的emp表做inner join。可以这样转换的前提是dept表的deptno列是唯一键。如果deptno列不是唯一键,将做semi join(即所谓的半连接):
 Oracle 查询转换初探

如果不做子查询展开,就会走filter类型的执行计划,并且子查询放在最后一步执行,作用是对emp全表扫描之后的结果集进行过滤:
 Oracle 查询转换初探
看一个子查询结果集作为内联视图与外层查询块做join的例子:
 Oracle 查询转换初探

执行计划仍然走了hash join semi,要使得转换是等价的,必须先完成子查询中departments和locations的join,结果集作为内联视图VM_NSO_1,与外层查询块的结果集做join。

下面的执行计划中,子查询的结果被作为nest loop的驱动表,为保证结果集正确,需要对子查询做hash unique去重。
 Oracle 查询转换初探

如果满足(不限于)下面的条件,子查询展开可能导致转换不等价,因此将不作展开:

·         where后面的连接符为=all或者<> any

·         exists后面的子查询中带有rownum

·         exists后面的子查询中带有having子句,cube子句或者rollup子句

例如下面的例子:
 Oracle 查询转换初探

视图合并

视图合并是指对包含视图的查询做出转换,使查询只包含基表。视图合并提供了更多的访问路径和join的可能性。也就是说,不做视图合并的执行计划包含在做了视图合并的执行计划中。下面的例子可以帮助理解这句话:
 Oracle 查询转换初探

如果不做视图合并,执行计划如下:
 Oracle 查询转换初探

可以看到不对emp100做视图合并,执行计划中出现view字样,name列对应的就是视图名emp100。
第二个执行计划除了多了view的一行,访问路径和成本是和第一个相同的。
如果视图定义中包含下列内容,将不能做视图合并:

·         集合操作符(UNION,UNION ALL,INTERSECT,MINUS)

·         connect by子句

·         rownum伪列
做这些限制是为了防止视图合并之后得到错误的结果集。
不能视图合并的例子:
 Oracle 查询转换初探

复杂视图合并

复杂视图合并技术允许对包含Gourp by或者distinct的视图做展开。

 Oracle 查询转换初探

_COMPLEX_VIEW_MERGING参数控制是否激活复杂视图合并,在9i之后默认为true,同时受OPTIMIZER_FEATURES_ENABLE参数控制:
 Oracle 查询转换初探

外连接视图合并

使用了外连接的sql中,视图合并需要满足下列条件之一:

·         视图为外连接的驱动表

·         视图的定义只包含单表
下例中视图v1包含两张基表,在做外连接的驱动表时发生视图合并,做被驱动表则没有。
 Oracle 查询转换初探  Oracle 查询转换初探

谓词推入

优化器在处理不能合并的视图时,可以选择将外部查询的谓词推入该视图的查询块,或者将视图中的谓词拉出到主查询。这样更早的处理视图的结果集,有可能会减小后续步骤操作所需的成本。
谓词推入到视图内部的例子:
 Oracle 查询转换初探

注意到执行计划中条件EMPLOYEE_ID<205被推入到视图内部,将两张基表各过滤一次,然后对结果集做union。
两表关联时,连接条件也可以做推入,先来看不做谓词推入的执行计划: Oracle 查询转换初探

执行计划中emp13作为驱动表与departments表做nest loop,我们使用hint强制发生谓词推入:
 Oracle 查询转换初探

可以看到执行计划中出现PUSHED PREDICATE字样,条件e.department_id=d.department_id被转换成等值条件对employees表做过滤。join的谓词推入往往产生nest loop的执行计划(驱动表的每一行驱动被驱动表,来做谓词的过滤)。如果是大数据集的sql,可以使用hint no_push_pred或者设置参数_push_join_predicate为false禁止谓词推入。

星型转换

星型转换为提高星型查询的效率发生,在原有条件基础上会产生新的子查询对事实表做过滤,然后通过对事实表相应连接列的位图索引做位图操作,达到过滤事实表结果集的目的。
是否开启星型转换受参数star_transfORMation_enabled控制,可以设置为:
true:优化器将考虑基于成本的星型查询转换;
false:禁止星型转换;
temp_disable:优化器将考虑基于成本的星型查询转换,但是转换中不会使用临时表。
首先看一下星型转换的例子:

 Oracle 查询转换初探  Oracle 查询转换初探

注意到执行计划首先对各个维度表过滤出结果集,然后访问sales表连接列上的索引,做bitmap and操作之后,回表访问数据。事实上整个过程类似于将查询转换为如下等价sql:

 Oracle 查询转换初探

下面看一下star_transformation_enabled参数设置为true的结果:

 Oracle 查询转换初探
 Oracle 查询转换初探
 Oracle 查询转换初探
 Oracle 查询转换初探

注意到执行计划中先对customers根据过滤条件cu.country_id =52789得到临时表SYS_TEMP_0FD9D6601_11F1D1,后续步骤中每次需要访问customers表时则由临时表来替换,这也是为了总共减少所访问的数据量所考虑。
星型转换同样有一些限制条件,本文暂不讨论。

以上是对四类查询转换概念性的描述,对于具体的应用场景中的SQL要具体分析如何利用这些技术。查询转换还有诸如子查询合并,连接因式分解,表扩展,表裁剪,物化视图重写等技术。有机会将再写文章介绍,或者有兴趣的同学自行研究。


您可能感兴趣的文档:

--结束END--

本文标题: Oracle 查询转换初探

本文链接: https://lsjlt.com/news/41123.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Oracle 查询转换初探
    概述Oracle查询转换器的作用是把原始sql重写为语义相同的语句,目的是为了获得更高效的sql。查询转换主要有四种技术:子查询展开,视图合并,谓词推入,星型转换。了解查询转换是掌握SQL优化的基础,本文将...
    99+
    2024-04-02
  • Oracle 查询转换之子查询展开
    概念:子查询展开(Subquery Unnesting)是优化器处理带子查询的目标sql的一种优化手段,它是指优化器不再将目标sql中子查询当作一个独立的处理单元来单独执行,而是将该子查询转换为它自身和外部...
    99+
    2024-04-02
  • Oracle 12CR2查询转换之临时表转换
    在12CR2中出现一种新的查询转换技术临时表转换, 在下面的例子中,数据库对customers表上的子查询结果物化到一个临时表中: SQL> show parameter&n...
    99+
    2024-04-02
  • Oracle 12CR2查询转换之星型转换的方法
    这篇文章主要为大家展示了“Oracle 12CR2查询转换之星型转换的方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle 12CR2查询转换之星型转...
    99+
    2024-04-02
  • ORACLE中的查询转换有哪些
    本篇内容主要讲解“ORACLE中的查询转换有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ORACLE中的查询转换有哪些”吧!一、子查询展开(subquery unnesting)子查询展开...
    99+
    2023-05-31
  • Oracle 12CR2查询转换教程之临时表转换详解
    前言 大家都知道在12CR2中出现一种新的查询转换技术临时表转换, 在下面的例子中,数据库对customers表上的子查询结果物化到一个临时表中: SQL> show parameter star...
    99+
    2024-04-02
  • Oracle 12CR2查询转换之视图合并
    这里的测试数据库版本为12.2.0.1,在视图合并中,优化器代表视图的查询块到包含视国的查询块中。视图合并通过让优化器考虑额外的连接顺序,访问方法与其它转换来提高性能。例如,在一个视图被合并后并且在一个查...
    99+
    2024-04-02
  • Oracle查询转换之连接谓词推入
    连接谓词推入(Join Predicate  Pushdown)是优化器处理带视图的目标SQL的一种优化手段,它是指虽然优化器会把该SQL中视图的定义SQL语句当作一个独立单元来单独执行,但此时优...
    99+
    2024-04-02
  • Oracle Wallet初探
    Oracle Wallet初探1.  什么是WalletA datastructure used to store and manage security credentials for...
    99+
    2024-04-02
  • 将古老的ASP项目转换为PHP初探
    ASP 是一种服务器端脚本语言,主要用于开发动态 Web 应用程序。ASP 可以在服务器上执行代码,并将结果返回给客户端浏览器,实现动态生成 Web 页面的功能。 ASP 代码通常包含在 标记中,以下是一个简单的 ASP 程序示例: ...
    99+
    2023-08-31
    asp php 代码转换 Powered by 金山文档
  • 将 go-pg 查询转换为纯 sql
    本篇文章向大家介绍《将 go-pg 查询转换为纯 sql》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。问题内容是否可以转换go-pg查询 err = db.Model(story). ...
    99+
    2024-04-05
  • GORM 将查询文本转换为小写
    哈喽!今天心血来潮给大家带来了《GORM 将查询文本转换为小写》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章...
    99+
    2024-04-05
  • Oracle查询_ 单表查询
    前面我们详解了关于Oracle的增删改,今天让我们接着来学习Oracle的查询吧, Oracle中查询可是重头戏噢!!!跟着煌sir的步伐,走位,走位~~~   小知识锦囊 在此前,先讲解一个小知识点 Oracle注释,这对我们开...
    99+
    2019-07-22
    Oracle查询_ 单表查询
  • mysql中怎么实现时区转换查询
    这篇文章将为大家详细讲解有关mysql中怎么实现时区转换查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。mysql中使用convert_tz函数可以实现时...
    99+
    2024-04-02
  • Oracle 12CR2查询转换教程之cursor-duration临时表的示例分析
    小编给大家分享一下Oracle 12CR2查询转换教程之cursor-duration临时表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
    99+
    2024-04-02
  • Oracle查询如何才能行转列?-sunziren
      原创文章,转载务必注明出处。   今天工作的时候,碰到一个问题,涉及oracle行转列,用了半小时解决,因此在这里写个博客记录一下解决办法。   原数据库表的数据是:       想要达到的效果是:       经过思考,这...
    99+
    2019-05-07
    Oracle查询如何才能行转列?-sunziren
  • 查询oracle中所有用户信息(转)
    ----查询oracle中所有用户信息 ----1、查询数据库中的表空间名称 ----1)查询所有表空间 select tablespace_name from dba_tablespaces; select tab...
    99+
    2019-03-28
    查询oracle中所有用户信息(转) 数据库入门 数据库基础教程 数据库 mysql
  • PostgreSQL 源码解读(202)- 查询#115(类型转换)
    本节简单介绍了PostgreSQ...
    99+
    2024-04-02
  • JPA 查询原生SQL转换VO对象方式
    目录JPA查询原生SQL转换VO对象JPA非注解方式原生sql查询的一些注意事项JPA查询原生SQL转换VO对象 List<String> sqlList = Ri...
    99+
    2024-04-02
  • C#怎么将DataReader查询结果转换成DataTable
    要将DataReader查询结果转换为DataTable,你可以按照以下步骤进行操作:1. 创建一个空的DataTable对象。2....
    99+
    2023-08-08
    C#
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作