首页 > 数据库 >Oracle Hint(提示)之MERGE

Oracle Hint(提示)之MERGE

时间:2023-11-23 10:33:27浏览次数:47  
标签:name Hint t2 owner t1 MERGE 视图 Oracle 查询

MERGE提示的作用和使用方法

MERGE提示是指导优化器,合并查询中的视图。出现在from子句中的子查询,也被视为视图。

MERGE提示的使用语法如下图所示:

Oracle Hint(提示)之MERGE_执行计划


其中:

tablespec表示目标表的名称或别名(当有别名时,必须用别名)。但不要加入表的属主(SCHEMA)名,哪怕在SQL中,明确写了属主,提示中也不能写。

queryblock表示查询块。优化器在为一条SQL制定执行计划时,会将该SQL中涉及的子查询和视图,拆分为相应的查询块。分别为每一个查询块制定执计划。

这里需要注意的是,当MERGE后面不带参数时,需要把MERGE写到视图所在的查询块内,而带参数时,则要写到外层的查询中。

其使用方法和注意事项,也与INDEX提示相同,为节省篇幅,这再不再赘述。

下面,我们通过实验来说明施加该提示时,优化器是如何来合并视图的。

测试验证

首先,我们创建两张测试表TESTTAB和TABLIST,并分别收集统计信息:

Oracle Hint(提示)之MERGE_sql优化_02

设置SQLPLUS下的环境参数,以便显示的内容方便查看。如下图所示:

Oracle Hint(提示)之MERGE_sql优化_03

发出以下查询:

select t1.owner,t1.object_name,t1.object_id
  from testtab t1,
       (select owner,max(table_name) max_name
	       from tablist 
		 group by owner) t2
where t1.owner=t2.owner
  and t1.object_name=t2.max_name
  and t1.object_type like 'TABLE%';

在该查询中,别名为t2的子查询,出现在了外层查询的from子句中,其亦被视为视图。当我们什么提示都不加时,Oracle优化器给出的执行计划如下所示:

Oracle Hint(提示)之MERGE_SQL_04

如上图所示,我们可以看到子查询t2并没有被“合并”,而是先进行处理,其处理后的结果,再与t1表做关联。

而当我们添加merger提示后,如下所示:

select /*+ merge(t2) */ t1.owner,t1.object_name,t1.object_id
  from testtab t1,
       (select owner,max(table_name) max_name
	       from tablist 
		 group by owner) t2
where t1.owner=t2.owner
  and t1.object_name=t2.max_name
  and t1.object_type like 'TABLE%';

这里请注意,由于该merge提示是在主查询上添加的,所以,需要带上参数,指定对t2表示的视图进行合并。其执行计划如下图所示:

Oracle Hint(提示)之MERGE_merge_05

如上图所示,我们可以看到tablist表是先与主查询中的testtab表做关联,关联后的结果再做的GROUP BY处理。
如前所述,当我们把merger提示写到视图所在的查询块内时,不需要加参数,如下所示:

select t1.owner,t1.object_name,t1.object_id
  from testtab t1,
       (select /*+ merge */ owner,max(table_name) max_name
	       from tablist 
		 group by owner) t2
where t1.owner=t2.owner
  and t1.object_name=t2.max_name
  and t1.object_type like 'TABLE%';

此时的执行计划与上一SQL的执行计划是相同的。

当视图单独处理时,可以产生较少的中间结果时,不合并通常效率会更高,反之,如果视图内的表先与外层查询中的表关联后,能大幅减少中间结果,则合并通常会效率更高。

知识总结

1、MERGE提示是指导优化器,合并查询中的视图。出现在from子句中的子查询,也被视为视图。
2、当MERGE后面不带参数时,需要把MERGE写到视图所在的查询块内,而带参数时,则要写到外层的查询中。

参考文档

《Oracle® Database SQL Language Reference》

标签:name,Hint,t2,owner,t1,MERGE,视图,Oracle,查询
From: https://blog.51cto.com/u_13482808/8525351

相关文章

  • Oracle、达梦:同一数据库边查询边插入的两种方式
    1、方式1插入的表需要构建好--建表:6秒500毫秒;抽数据100万:10秒640毫秒、11秒189毫秒insertintoT_HUGE_COMPRESS(ID,NAME)(SELECT*FROMT_HUGE_COMPRESS_BACK);2、方式2插入的表不用创建好,也可以创建好。--2、普遍表CREATETABLE"T_PUTONG_01"ASSELEC......
  • Oracle Linux 8.9 发布 - Oracle 提供支持 RHEL 兼容发行版
    OracleLinux8.9发布-Oracle提供支持RHEL兼容发行版OracleLinuxwithUnbreakableEnterpriseKernel(UEK)&RedHatcompatiblekernel(RHCK)请访问原文链接:https://sysin.org/blog/oracle-linux-8/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgOracle......
  • 查ORACLE 锁表
     查询发生死锁的select语句selectsql_textfromv$sqlwherehash_valuein(selectsql_hash_valuefromv$sessionwheresidin(selectsession_idfromv$locked_object)) --首先查看有哪些锁s......
  • Oracle、达梦:获取两个表中差异的数据:minus(减法)
    Oracle、达梦:获取两个表中差异的数据:minus(减法)mysql没有。需要用别的方式替换表结构必须一致,数据也必须一致才能减去真实意思:T_1中的数据减去T_2中的数据。返回还多余的数据相当于3-2=1、3-0=3。这个例子中的0、1、2、3表示的是一行一行的数据SELECT*fromT_1m......
  • Oracle创建查询账户,并授予查询其他用户表权限
    要在Oracle数据库中创建新的查询用户,以便可以访问表和视图等信息一、登录DBA权限的账号1、可以使用命令窗口登录,进行数据库管理connsys/sys123assysdba;2、也可以使用plsql登录以上两种方式自选其一登录。二、新建表空间、用户此部分操作由于在另一篇随笔中有详细记录......
  • Oracle数据泵导入导出
    由于在oracle11g之后的某些版本中,采用exp方式导出数据会导致空表被漏掉,解决办法分为两种:一、对空表进行插入操作,然后再删除数据。二、采用数据泵的方式导出。本文介绍第二种方式。导出:1、从cmd中以dba权限登录数据库:sqlplussystem/密码@orclassysdba;2、创建目录: Create......
  • 实例讲解C++连接各种数据库,包含SQL Server、MySQL、Oracle、ACCESS、SQLite 和 Postgr
     C++是一种通用的编程语言,可以使用不同的库和驱动程序来连接各种数据库。以下是一些示例代码,演示如何使用C++连接SQLServer、MySQL、Oracle、ACCESS、SQLite和PostgreSQL、MongoDB数据库。连接SQLServer数据库要使用C++连接SQLServer数据库,可以使用Micro......
  • Oracle实时同步技术
    Oracle数据库的价值Oracle数据库是一种高度可靠、安全和强大的关系型数据库管理系统,它具有以下几个方面的价值:可靠性和稳定性:Oracle数据库以其高度可靠性、稳定性和数据完整性而闻名于世。安全性:Oracle数据库提供了一系列强大的安全功能,包括访问控制、加密、身份验证和审计。处理大......
  • oracle 静默安装 rac 转载 :https://www.modb.pro/db/1723739796005281792
    这里先为大家附上Oracle各版本支持的生命周期及发布时间线,当前较为常用的主流版本则为Oracle11g和Oracle19c以及明年发布的Oracle23c等版本。本文是对11g和19c两个主流版本的单机文件系统、单机ASM和RAC三种架构的静默安装简要步骤,并不包含所有操作步骤,仅供参考......
  • 为Oracle链接服务器使用分布式事务
    1现象在SQLServer中创建指向Oracle的链接服务器,SQL语句在事务中向链接服务器插入数据。返回链接服务器无法启动分布式事务的报错。 2解决在Windows平台下,SQLServer依赖分布式事务协调器(MSDTC)来使用分布式事务,OracleClient使用OracleServicesforMicrosoftTransact......