Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1182574
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2008-01-06 21:37:59

       子查询因子在Oracle 9i中出现,有两个好处。一、使复杂的查询可读性增强;二、可以是优化器找到新的优化方案。

       语法如下:

with {subquery_name_1} as (
        select statement 1
),
{subquery_name_2} as (
        select statement 2
        possibly referencing object {subquery_name_1}
)
select ...
from
        subquery_name_1  sq1,
        subquery_name_2  sq2,
        some_table       st
where   ...

       然后执行以下查询两个查询:

create table t1
nologging              -- adjust as necessary
as
with generator as (
       select      /*+ materialize */
              rownum        id
       from all_objects
       where     rownum <= 3000
)
select
       /*+ ordered use_nl(v2) */
       rownum                id,
       lpad(rownum,10,'0')      small_vc,
       rpad('x',100)          padding
from
       generator v1,
       generator v2
where
       rownum <= 1000000
;

 

create table t1
nologging              -- adjust as necessary
as
 select
       /*+ ordered use_nl(v2) */
       rownum                id,
       lpad(rownum,10,'0')      small_vc,
       rpad('x',100)          padding
from
       all_objects v1,
       all_objects v2
where
       rownum <= 1000000
;

       你会发现这两个CTAS简直是天壤之别,第二个被执行了N分钟之后被我取消。在子查询中的/*+ materialize */(未文档化)提示强制Oracle创建一个全局临时表(可能会非常的有用),否则Oracle将会尝试执行all_objects的自我连接笛卡尔乘积。使用了这个提示后,将指挥在两个小的表上进行连接。如果希望阻塞创建临时表,可以使用/*+ inline */提示。

       但是使用全局临时表要考虑的问题是I/O负载。因为结果集会创建在临时表空间中。

阅读(1273) | 评论(0) | 转发(0) |
0

上一篇:Table函数的作用

下一篇:latch的概念

给主人留下些什么吧!~~