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

Oracle 具有列数据类型的CTAS

askTom 2016-11-22
133

问题描述

你好AskTom团队,

通常,我们将CTAS编码为

创建表< TABLE_NAME> AS SELECT 从< TABLE_NAME>位置。。

我有一个要求,我必须创建一个具有特定结构的TMP表,该结构稍后用于交换分区。这个表大约有25列,可能有几百万行数据。

我们尝试了两种选择

第1个选项(此选项比直接在表上执行INSERTAPPEND快):

1) CREATE具有所需结构的TMP表
2)插入/*+APPEND*/进入...选择
3)交换分区

第二种选择:

1)创建表作为Select ( VARCHAR2(255 ) ) col1、col2 as日期) col2、....自
2)交换分区

经过几次试验后,第二种选择似乎更快。

但我认为在数百万行上的所有列上运行“执行”仍然不是最佳的。是否有其他方法来实现或优化此功能?

谢谢!

专家解答

无论哪种情况,您都可能需要进行数据类型转换,因此,如果第二种类型转换更适合您,那么请务必使用它。

在(1)中,即使TMP具有正确的数据类型,当数据被加载到TMP时,插入-选择也会调用一个数据转换,例如,插入到(date_col)选择来自...的字符串。即使您尚未显式编码TO_DATE函数,也会进行转换。

当然,在(2)中也同样适用,只是数据转换现在在SELECT中是明确的,但是净效果将是相似的。

如果有大量重复的日期,那么标量查询缓存可能会带来一些好处,例如

SQL> create table t1 ( x date );

Table created.

SQL> create table t2 ( s varchar2(20));

Table created.

SQL>
SQL> insert /*+ APPEND */ into t2
  2  select '2016-01-01' from
  3  ( select 1 from dual connect by level <= 1000 ),
  4  ( select 1 from dual connect by level <= 10000 );

10000000 rows created.

SQL>
SQL> commit;

Commit complete.

SQL>
SQL> set timing on
SQL> insert /*+ APPEND */ into t1 select to_date(s,'yyyy-mm-dd') from t2;

10000000 rows created.

Elapsed: 00:00:19.18
SQL> commit;

Commit complete.

SQL> drop table t1 purge;

Table dropped.

SQL> create table t1 ( x date );

Table created.

SQL> set timing on
SQL> insert /*+ APPEND */ into t1 select
  2    ( select to_date(s,'yyyy-mm-dd') from dual )
  3    from t2;

10000000 rows created.

Elapsed: 00:00:09.28
SQL> commit;

Commit complete.

SQL>
SQL>























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

评论