Oracle with as + /*+ materialize*/ 优化

本文介绍如何使用 WITH AS 子句提高 SQL 查询的可读性和性能,并探讨了 /*+materialize*/ 提示符的作用,即强制将 WITH AS 的结果集存储到临时表中以进一步提升查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

with as

概述:

  • WITH AS: 就是将一个子查询部分独立出来,有时候为了提高 sql 语句的可读性,有时候为了提高 sql 语句性能

使用场景:

  • 当有多个相似子查询的时候,用 with as 写公共部分。
  • 因为子查询结果在内存临时表中,故执行效率较高(临时表在会话结束后自动被 PGA 清除)

注意情况:

  • 一般来说,如果 with as 短语定义的表名被调用 2 次及以上,则 CBO 优化器会自动把 with as 短语所获取的数据放入临时表中(对应执行计划中的 SYS_TEMP_XXX)。
  • 如果只是被调用 1 次,则不会。

/+ materialize/ 优化

hint 关键字描述
/*+ materialize*/会强制性要求 with as 中的结果转换为 临时表
/*+ inline*/与上相反,不转换

实例1:当 with as 短语定义的表名被使用 1 次时

WITH t_emp AS
 (SELECT /*+ materialize*/ e.empno, e.ename, e.sal
    FROM scott.emp e
   WHERE e.sal > (SELECT AVG(e_1.sal) FROM scott.emp e_1))
SELECT * FROM t_emp;

 
 

执行计划:
在这里插入图片描述

实例2:当 with as 短语定义的表名被使用 2 次及以上时

WITH t_emp AS
 (SELECT /*+ materialize*/ e.empno, e.ename, e.sal
    FROM scott.emp e
   WHERE e.sal > (SELECT AVG(e_1.sal) FROM scott.emp e_1))
SELECT * FROM t_emp t WHERE t.empno = '7566'
UNION ALL
SELECT * FROM t_emp t WHERE t.empno = '7698';

 
 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值