with as 加上 materialize hint 生成实质临时表
WITH AS:
就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能。
如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使用with as来提高性能。
注意:
如果 with as 短语没有被调用2次以上,CBO就不会讲这个短语获取的数据放入temp表,如果想要讲数据放入temp表需要使用materialize hint
如果 with as 短语被调用了2次以上, CBO会自动将 with as 短语的数据放入一个临时表,这个时候不用写materialize hint 举个例子(本例基于Scott用户) SQL> explain plan for
with a as (select /*+ materialize */ ename,job,deptno from emp where sal>(select avg(sal) from emp))
select * from a ; Explained. SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------
Plan hash value: -------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------------
| | SELECT STATEMENT | | | | ()| :: |
| | TEMP TABLE TRANSFORMATION | | | | | |
| | LOAD AS SELECT | SYS_TEMP_0FD9D6605_E16CE | | | | |
|* | TABLE ACCESS FULL | EMP | | | ()| :: |
| | SORT AGGREGATE | | | | | |
| | TABLE ACCESS FULL | EMP | | | ()| :: |
| | VIEW | | | | ()| :: |
| | TABLE ACCESS FULL | SYS_TEMP_0FD9D6605_E16CE | | | ()| :: |
------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- - filter("SAL"> (SELECT AVG("SAL") FROM "EMP" "EMP")) rows selected. 去掉 /*+ materialize */ ,由于只访问了一次a,所以CBO不会将a的查询结果生成一个临时表 SQL> explain plan for
with a as (select ename,job,deptno from emp where sal>(select avg(sal) from emp))
select * from a ; Explained. SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------
Plan hash value: ----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| | SELECT STATEMENT | | | | ()| :: |
|* | TABLE ACCESS FULL | EMP | | | ()| :: |
| | SORT AGGREGATE | | | | | |
| | TABLE ACCESS FULL| EMP | | | ()| :: |
---------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- - filter("SAL"> (SELECT AVG("SAL") FROM "EMP" "EMP")) rows selected. WITH AS 语句调用一次 使用多次 需要写hints 如果 表 只 扫描 1次,你些materialize hints 结果读了一次 还写入temp, 再从temp读出来
临时表写入是1次,但是读要多次。 继续测试:
SQL> explain plan for
with a as (select ename,job,deptno from emp where sal>(select avg(sal) from emp))
select * from a union all select * from a; Explained. SQL> select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------
Plan hash value: --------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU) | Time |
--------------------------------------------------------------------------------------------------------
| | SELECT STATEMENT | | | | ()| :: |
| | TEMP TABLE TRANSFORMATION | | | | | |
| | LOAD AS SELECT | SYS_TEMP_0FD9D6601_4DC46A | | | | |
|* | TABLE ACCESS FULL | EMP | | | ()| :: |
| | SORT AGGREGATE | | | | | |
| | TABLE ACCESS FULL | EMP | | | ()| :: |
| | UNION-ALL | | | | | |
| | VIEW | | | | ()| :: |
| | TABLE ACCESS FULL | SYS_TEMP_0FD9D6601_4DC46A | | | ()| :: |
| | VIEW | | | | ()| :: |
| | TABLE ACCESS FULL | SYS_TEMP_0FD9D6601_4DC46A | | | ()| :: |
-------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- - filter("SAL"> (SELECT AVG("SAL") FROM "EMP" "EMP")) Note
-----
- dynamic sampling used for this statement (level=) rows selected. 充分证明 :
.当with as 语句没有被调用2次以上时,如果表需要访问多次,那么需要加hints /*+ materialize */ .如果with as 语句被调用2次以上时,自动会将 with as 短语的数据放入一个临时表,这个时候不用写materialize hint ---------------------
作者:zhaoyangjian724
来源:CSDN
原文:https://blog.csdn.net/zhaoyangjian724/article/details/17692199
版权声明:本文为博主原创文章,转载请附上博文链接!
with as 加上 materialize hint 生成实质临时表的更多相关文章
- 讨论贴:在sp_executesql 中生成的临时表的可见性
首先创建数据表 IF object_id('TestTable') IS NOT NULL DROP TABLE TestTable GO ,),Info )) GO INSERT TestTable ...
- WITH+HInt MATERIALIZE 不见得有效
那个要多次调用才需要物化的. 只调用一次,物化没用 MATERIALIZE 语法:MATERIALIZE 描述:指示优化器将内联视图实体化————执行过程中会创建基于视图的临时表. with dd ...
- 【SQL】ORACLE生成临时表
在日常的SQL查询中,我们需要对要查询的数据进行事先处理,然后再在预先处理好的数据里面进行查询.此时我们就需要用到临时表了,将数据预先处理好放到临时表里面,然后再在临时表里根据我们需要的条件进行查询. ...
- WITH AS and materialize hints
WITH AS: 就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能. 如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使 ...
- 转://WITH AS and materialize hints
WITH AS: 就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能. 如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使 ...
- sqlserver 存储过程中使用临时表到底会不会导致重编译
曾经在网络上看到过一种说法,SqlServer的存储过程中使用临时表,会导致重编译,以至于执行计划无法重用, 运行时候会导致重编译的这么一个说法,自己私底下去做测试的时候,根据profile的跟踪结果 ...
- C#生成PDF文档,读取TXT文件内容
using System.IO;using iTextSharp.text;using iTextSharp.text.pdf; //需要在项目里引用ICSharpCode.SharpZipLib.d ...
- 韦大仙--简单的monkey测试命令行操作及生成log日志保存
作中,在将apk交给软件测试人员去测试之前,不免要自己先自测,monkey自测是一个不错的选择! 步骤很简单: 1.测试用的手机与电脑连接好USB ,并且安装好驱动(我一般都是通过豌豆荚自动安装的)! ...
- sql生成一个日期表
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Auth ...
随机推荐
- vuejs2.0运用原生js实现简单的拖拽元素功能
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- Copy Control settings
Copy Control settings Skip to end of metadata Created by Rajesh Banka, last modified by Jyoti ...
- eclipse中web项目没有run on server
刷新web项目,项目->右击->Properties->Project Facets,选择Java和Dynamic Web Module.点击Apply and Close,再次运行 ...
- Windows系统java下载与安装
Windows系统java下载与安装 一.前言 作者:深圳-风尘 联系方式:QQ群[585499566] 博客:https://www.cnblogs.com/1fengchen1/ 能读懂本文档人: ...
- .NET Core 2.0
下载 Visual Studio 2017 version 15.3 下载 .NET Core 2.0 下载 Visual Studio for Mac 微软今天发布了.NET Core 2.0 版本 ...
- scrapy实例:爬取中国天气网
1.创建项目 在你存放项目的目录下,按shift+鼠标右键打开命令行,输入命令创建项目: PS F:\ScrapyProject> scrapy startproject weather # w ...
- jvm程序执行慢诊断手册
生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长.本文分享,从业多年形成的排查守则. 诊断步骤 系统资源查看 首先是系统资源查看,而且必须是在第一步.因为很多事故都是 ...
- lua时间戳和日期转换及踩坑
介绍lua的日期函数常用方法及我的一个踩坑. 时间戳转日期 os.date("%Y%m%d%H",unixtime) --os.date("%Y%m%d%H", ...
- Win10 使用笔记
前言 记录我在使用过程的一些笔记,本文所写内容,基于笔者所使用的两款win10操作系统: win10 x64 企业版 (1607) win10 x64 专业版 (1703) Win10 五笔输入法 使 ...
- oracle外部表
关于外部表的描述 正确描述 the create table as select statement can be used to upload data into a normal table in ...