Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >87-with as写法的5种用途

87-with as写法的5种用途

作者头像
老虎刘
发布于 2022-06-22 10:29:28
发布于 2022-06-22 10:29:28
7420
举报

with as的写法, 有一个专有名词, 叫common table expression, 简称CTE,很多开发人员把使用这种写法当成一个提高SQL执行效率的方法, 事实究竟如何, 请往下看.

oracle优化培训之<SQL写法与改写>第二期 的课程中, 我给学员讲了with as的几个用途,下面逐一介绍:

1. 通过materilize生成临时表, 达到优化SQL目的.

比如一个大表(或一段查询块), 在SQL中被多次使用, 每次访问表, 都有一些共同的过滤条件, 过滤之后, 结果集变小, 这种情况就比较适合使用with as的写法. 注意, 不要以为使用了with as, 就能提高性能, 使用不当反而会降低性能. 只在特定情况下才能提升效率.

我的另一篇公众号文章 记一个Enq: ss - contention性能问题处理 , 就是这样一个案例, 不过这个案例的最佳解决方案是进一步改写, 表只需要被访问一次.

相关知识点:

如果with as 查询块被使用2次或两次以上, 会自动做materialize, 如果不想被物化, 可以使用/*+ inline */的hint ;

如果查询块只被调用一次, 默认不会做materialize, 可以用/*+ materialize*/的hint来使其物化生成临时表.

注意:如果返回列中含有lob字段, 不能被materialize.

在12.2及以上版本中, materialize 有个新特性, 叫CURSOR DURATION MEMORY, 可以把结果集保存在内存中, 而不是写到temp表空间, 可以提升效率.

2.提高代码可读性

使代码有层次感, 增强可读性, 下面是对连续编号进行分组的一个写法:

with t as

( select rownum+1 as id from xmltable('1 to 5')

union

select rownum+10 from xmltable('1 to 4')

union

select rownum+20 from xmltable('1 to 2')

union

select rownum+30 from xmltable('1 to 3')

)

,mid1 as (select id,nvl(id-1-lag(id) over (order by id),0) as cal_id from t)

,mid2 as (select id,sum(cal_id) over (order by id) as sum1 from mid1)

select id,dense_rank() over (order by sum1) as group_no

from mid2

order by id;

对复杂的SQL, 都可以考虑使用这种写法, 增强代码的可读性.

3.实现递归算法

下面是计算9以内阶乘的写法

WITH temp (n, fact) AS

(SELECT 0, 1 from dual

UNION ALL

SELECT n+1, (n+1)*fact FROM temp

WHERE n < 9

)

SELECT * FROM temp;

connect by层级查询语法,很多都可以使用with as的递归写法替代实现.

4. 12c新特性 inline function, SQL里面可以内嵌函数

如下面示例(这个with , 没有as):

WITH

function cal_new_sal(p_sal number, p_hiredate date)

return number

is

begin

return p_sal*(1+ceil((sysdate-p_hiredate)/365)*0.05);

end;

select empno,ename,sal,hiredate

,cal_new_sal(sal,hiredate) as new_sal

,1+ceil((sysdate-hiredate)/365)*0.05 as factor

from emp;

/

function代码没有保存在数据库中.

5.构造测试用例用临时数据

前面提高代码可读性的示例已经用到了, 下面示例是在19c之前, 使用listagg并去重的一种写法, with as的作用是生成了几行测试记录, 避免了建表和插入记录的麻烦:

with test_data(col1,col2,created_by) as

(

select 1, 2, 'Smith' from dual

union all select 1, 2, 'John' from dual

union all select 1, 3, 'Ajay' from dual

union all select 1, 4, 'Ram' from dual

union all select 1, 5, 'Jack' from dual

union all select 2, 5, 'Smith' from dual

union all select 2, 6, 'John' from dual

union all select 2, 6, 'Ajay' from dual

union all select 2, 6, 'Ram' from dual

union all select 2, 7, 'Jack' from dual

)

SELECT col1 ,

listagg(col2 , ',') within group (order by col2 ASC) AS orig_value,

listagg(CASE WHEN rn=1 THEN col2 END , ',') within group (order by col2 ASC) AS distinct_value

from

(

select a.*,row_number() over (partition by col1,col2 order by 1) as rn from test_data a

) a

GROUP BY col1;

总结:

用的最多的功能应该是提高代码可读性; 利用 materialize 特性优化SQL, 也是开发人员需要考虑的.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
45 个非常有用的 Oracle 查询语句
这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧!
用户7705674
2021/09/23
7660
Oracle高级查询-imooc
本章介绍多表查询的概念,什么是笛卡尔集,等值连接、不等值连接、外连接、自连接和层次查询等多表连接查询的内容。
chenchenchen
2023/01/30
2.3K0
Hive语法内关于With as 的数据是否会缓存到内存分析
  WITH AS短语,也叫做子查询部分(subquery factoring),可以定义一个SQL片断,该SQL片断可以被后面的SQL语句引用,从而使SQL语句的可读性更高。
挽风
2021/12/07
1.4K0
Oracle知识点总结(一)
这里用1,也是为了方便,当然如果数据量较大的话,也可以提高速度,因为写count(*)的话会所有列扫描,这里用1的话或者用字段名的话,只扫描你写的那个列其实1就代表你这个查询的表里的第一个字段
用户1093975
2018/08/02
2.4K0
【DB笔试面试570】在Oracle中,SQL优化在写法上有哪些常用的方法?
一般在书写SQL时需要注意哪些问题,如何书写可以提高查询的效率呢?可以从以下几个方面去考虑:
AiDBA宝典
2019/09/29
3.8K0
高薪面试题之三.DB必备
40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧!
张哥编程
2024/12/17
1410
MySQL数据库(良心资料)
我们所说的数据库泛指“关系型数据库管理系统(RDBMS-Relational database management system)”,即“数据库服务器”。
阮键
2019/09/29
1.4K0
Oracle到高斯数据库的SQL语法迁移手册(建议收藏)
异构数据库的迁移(譬如从Oracle迁移到openGauss)工作主要包括三个方面,
PawSQL
2024/08/20
8620
Oracle到高斯数据库的SQL语法迁移手册(建议收藏)
Oracle到PostgreSQL数据库的语法迁移手册(建议收藏)
异构数据库的迁移(譬如从Oracle迁移到PostgreSQL)工作主要包括三个方面,
PawSQL
2024/08/20
5270
Oracle到PostgreSQL数据库的语法迁移手册(建议收藏)
mybatis 中oracle 批量新增三种方法
第一种 < insert id =" insert_table " parameterClass ="java.util.List" > <![CDATA[ insert into sj_test( col1 , col2 , col3 ) values ]]> < iterate conjunction ="," > <![CDATA[ (#test[]. col1 #, # test []. col2 #, # test []. col3 #) ]]> </ iterate > </ insert >
斯文的程序
2019/11/07
2.4K0
Oracle11g全新讲解之SQL讲解
  SQL是结构化查询语言(Structured Query Language),专门用于数据存取、数据更新及数据库管理等操作。
用户4919348
2023/03/23
1.3K0
Oracle11g全新讲解之SQL讲解
数据库相关
【数据库系统概述】 常用的数据库有MySql、oracle等。不同数据库都支持sql标准,并且不同数据库在sql标准的基础上进行了一些扩充。 对于数据库的学习包括:sql>过程、触发器等内容,其中重要程度如下: sql>过程、触发器等 oracle数据库: 1、oracle的开发部分,包含两个部分:sql+plsql编程 2、oracle管理部分,数据库配置和运行维护 【oracle简介】 oracle默认有sys和system两个用户,其中 sys: 超级管理员,拥有操作数据库的所有权限 syst
代码改变世界-coding
2018/07/03
2.1K0
day43_Oracle学习笔记_02
八、子查询 示例代码如下: 子查询.txt SQL> --rownum 行号 SQL> select rownum,empno,ename,sal from emp;     ROWNUM      EMPNO ENAME             SAL                                                                                                                                
黑泽君
2018/10/11
8080
day43_Oracle学习笔记_02
SQL优化一(SQL使用技巧)
1、行列转换:   decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值);   select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值   sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1   例如:   变量1=10,变量2=20   则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。 举例:查询emp表中的每个部门的人数? SELECT sum(deco
JMCui
2018/03/15
2.7K0
SQL优化一(SQL使用技巧)
hql和sql练习题
select t.ename,t.empno,t.deptno from emp t where t.job = ‘CLERK’
张哥编程
2024/12/17
1300
javaweb-oracle-1-57
找到oracle默认的配置文件,复制到其他地方配置成环境变量自动装填数据 C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
全栈程序员站长
2021/05/19
6840
数据库表中常用的查询实验
select ename,sal from emp where deptno=10;
Twcat_tree
2022/11/30
1.1K0
SQL Tips
出自:http://blog.csdn.net/etmonitor/一.怎样删除一个表中某个字段重复数据库
Java架构师必看
2020/10/26
6280
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
背景:要迁移数据库,需要创建与源库相同的表空间,大小与源库相同。由于个别表空间较大,手工添加可能需要写很多的脚本,于是同事通过PL/SQL解决了问题。
数据和云
2021/10/13
1.2K0
Oracle DBA的SQL编写技能提升宝典(含SQL资源)
Oracle数据库之第二篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
5570
相关推荐
45 个非常有用的 Oracle 查询语句
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档