问题描述
嗨
我确实喜欢在长select语句中使用 'with' 语法 (通用表表达式)。
对我来说,它们使陈述更具可读性。
在查看该执行计划时,会注意到有时这些语句正在使用内部表。
这些表到底是什么?全局临时表?
他们会从使用TEMP_UNDO_ENABLED初始化参数中受益吗?
左侧
我确实喜欢在长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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




