暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle TEMP_UNDO_ENABLED和带子句

askTom 2017-03-15
852

问题描述




我确实喜欢在长select语句中使用 'with' 语法 (通用表表达式)。
对我来说,它们使陈述更具可读性。


在查看该执行计划时,会注意到有时这些语句正在使用内部表。

这些表到底是什么?全局临时表?
他们会从使用TEMP_UNDO_ENABLED初始化参数中受益吗?


左侧

专家解答

也许有点,但没有你想象的那么多。我们将查看示例语句执行前后的 “重做大小”


SQL> connect mcdonac/alicat1
Connected.

mcdonac@np12
SQL> alter session set temp_undo_enabled = false;

Session altered.

SQL> @mystat
Enter value for statname: redo size

NAME                                                    VALUE
-------------------------------------------------- ----------
redo size                                                 924

SQL>
SQL> with bigtab as
  2   ( select /*+ materialize */ d.*
  3     from dba_objects d,
  4        ( select 1 from dual connect by level <= 20 )
  5    )
  6  select max(object_id) from bigtab;

MAX(OBJECT_ID)
--------------
        101352

1 row selected.

SQL> @mystat
Enter value for statname: redo size

NAME                                                    VALUE
-------------------------------------------------- ----------
redo size                                                2304

SQL>
SQL> connect mcdonac/alicat1
Connected.

SQL> alter session set temp_undo_enabled = true;

Session altered.

SQL> @mystat
Enter value for statname: redo size

NAME                                                    VALUE
-------------------------------------------------- ----------
redo size                                                 940

SQL>
SQL> with bigtab as
  2   ( select /*+ materialize */ d.*
  3     from dba_objects d,
  4        ( select 1 from dual connect by level <= 20 )
  5    )
  6  select max(object_id) from bigtab;

MAX(OBJECT_ID)
--------------
        101352

1 row selected.

SQL>
SQL> @mystat
Enter value for statname: redo size

NAME                                                    VALUE
-------------------------------------------------- ----------
redo size                                                2080

SQL>


你可以有一点不同,但这里最主要的是没有太多的重做。负载就像 “创建表作为选择”,而不是像 “插入” 这样的东西,* 将 * 使用大量的重做。

例如:

SQL> connect mcdonac/alicat1
Connected.

SQL> @mystat
Enter value for statname: redo size

NAME                                                    VALUE
-------------------------------------------------- ----------
redo size                                                 940

SQL>
SQL> create table bigtab as select * from dba_objects where 1=0;

Table created.

SQL> insert into bigtab
  2  select d.*
  3  from dba_objects d,
  4        ( select 1 from dual connect by level <= 20 );

1862280 rows created.

SQL>
SQL> @mystat
Enter value for statname: redo size

NAME                                                    VALUE
-------------------------------------------------- ----------
redo size                                           255080176


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论