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

Oracle 虚拟列上的范围分区-cta .. 语法不起作用

askTom 2018-02-06
251

问题描述

嗨,汤姆,

我有一个要求为现有表创建范围分区。

假设表名是Orders。

该表具有timestamp datatype的Order_Date列,数据在UTC时区。

[我们在文件中以UTC格式获取数据以加载到此表中,并且业务希望保持其状态,因此我们在加载前几天的数据时未在EST时区填充]

企业希望在未来的报告中以EST时区查询此表。我们必须为此表创建分区。所以我们的建议是创建一个虚拟列,它应该有EST时区,数据应该是时间戳格式 (应该与实际列相同),然后在这个虚拟列上创建范围分区。

我正在尝试使用CTAS... 语法创建partitoin表,如下所示

创建表订单 _ 部件
(订单id,
订单日期,
订单 _ 描述,
订单 _ zip,
Order_date_est as (cast(from_tz(订单日期, 'UTC') at time zone 'America/New_York' as timestamp))
)
按范围划分 (订单日期) 间隔 (numtodsinterval(1,“天”))
(分区p_before_2000值小于 (to_date('01-jan-2000 ','dd-mon-yyy')) 表空间ts1 pctfree 0)
表空间ts1 nologging pctfree 0
从订单中选择/* 并行 (8) */ *;

但是上面的代码给我错误 “SQL错误: ORA-01773: 可能未在此创建表中指定列数据类型”

我知道当我们使用cta语法时,我们不应该指定列数据类型。但是不确定如何在创建分区表的同时创建虚拟列。

我可以创建一个具有所有列名和数据类型的分区表,然后运行DML以插入所有数据,如下所示,

插入order_part作为select * 从订单;
但是在这种情况下,我们在原始表中有8000万条记录,因此不确定插入需要多少时间。因此,请建议我什么是完成我的要求的最佳方法。

提前谢谢。

专家解答

无论你做什么,你都有问题 .... 因为时区函数不是纯粹的

SQL> create table order_part
  2  ( order_id int,
  3    Order_ts timestamp,
  4    Order_date_est timestamp as (cast(from_tz(Order_ts, 'UTC') at time zone 'America/New_York' as timestamp))
  5  );
  Order_date_est timestamp as (cast(from_tz(Order_ts, 'UTC') at time zone 'America/New_York' as timestamp))
                                                             *
ERROR at line 4:
ORA-54002: only pure functions can be specified in a virtual column expression
复制


但这就是说,cta的性能成本与使用直接模式插入几乎相同

-创建表格
-插入/* 追加 */到


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

评论