ORACLE WITH AS和直接from(子查询)效率上面有什么不一样的嘛?

[复制链接]
查看11 | 回复9 | 2014-11-11 06:00:15 | 显示全部楼层 |阅读模式
有需要用到临时表,就准备看下WITH as的效率怎么样,为了能让大家都可以执行,我就直接以user_objects表为例:
下面是with as 建临时表查询的方法:

WITH objtype AS
(SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'TABLE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'INDEX'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'SEQUENCE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'PROCEDURE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'FUNCTION'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'MATERIALIZED VIEW'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'TRIGGER'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'DATABASE LINK'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'LOB'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'PACKAGE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'PACKAGE BODY'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'TYPE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'TYPE BODY'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'VIEW'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'SYNONYM'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'JAVA CLASS'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'JAVA SOURCE')
SELECT *
FROM objtype;复制代码下面是直接from(子查询)的代码:
SELECT * FROM (SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'TABLE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'INDEX'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'SEQUENCE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'PROCEDURE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'FUNCTION'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'MATERIALIZED VIEW'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'TRIGGER'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'DATABASE LINK'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'LOB'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'PACKAGE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'PACKAGE BODY'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'TYPE'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'TYPE BODY'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'VIEW'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'SYNONYM'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'JAVA CLASS'
UNION ALL
SELECT COUNT(*) cnt
FROM user_objects
WHERE object_type = 'JAVA SOURCE');复制代码

当然,这里只是为了看看withas 和 from(子查询)来进行效率对比,要实现此功能,其实非常的简单,下面这条语句就搞定了:
SELECTCOUNT(*)
FROM user_objects
WHERE object_type IN ('SEQUENCE','PROCEDURE','DATABASE LINK','LOB','PACKAGE','PACKAGE BODY','TYPE BODY','TRIGGER','MATERIALIZED VIEW','TABLE','INDEX','FUNCTION','VIEW','SYNONYM','JAVA CLASS','JAVA SOURCE','TYPE')
GROUP BY object_type;复制代码 下面是他们的执行效率:


with as 的执行效率如下:


with.png (15.95 KB, 下载次数: 18)
下载附件
oraclewithas临时表查询效率
2014-11-11 17:09 上传




如下为from(子查询)查询效率:


from.png (18.01 KB, 下载次数: 12)
下载附件
oraclefrom(子查询)查询效率
2014-11-11 17:09 上传


下面为in的查询效率:


in.png (14.38 KB, 下载次数: 11)
下载附件
oracle查询效率
2014-11-11 17:09 上传


关于执行计划这里就不说了


回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
我很少用with as,如果对这方面比较懂的,大家头脑风暴下,嘿嘿
回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
计划一样效率就一样
回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
哈哈,11g 优化器比较强大,如果是放到8i可就说不定了
回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
with as 主要是对于语句中多次引用sql结果集(中间集),一次生成,多次引用,执行效率非常高
回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
第三种只扫描一次,当然不能比。
如果需要反复引用结果就用WITH。
回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
kuaileshizhe200 发表于 2014-11-11 21:55
with as 主要是对于语句中多次引用sql结果集(中间集),一次生成,多次引用,执行效率非常高

OO ,这样啊
回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
newkid 发表于 2014-11-12 09:28
第三种只扫描一次,当然不能比。
如果需要反复引用结果就用WITH。

嗯嗯,很多时候需要使用临时中间表,可以拿来用的哈
回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
jinaqu 发表于 2014-11-12 09:32
OO ,这样啊

OO的说法很没错,可能with as 的结果就用了一次,那用或者不用没大区别
回复

使用道具 举报

千问 | 2014-11-11 06:00:15 | 显示全部楼层
kuaileshizhe200 发表于 2014-11-14 11:12
OO的说法很没错,可能with as 的结果就用了一次,那用或者不用没大区别

直接放在from后面也行,好奇心害死人,非要比较下,会继续关注,对这方面有啥想说的,欢迎多多交流哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行