Oracle Partition by 2 columns 间隔

Oracle Partition by 2 columns Interval

我试图在 google 上查找我的情况,但没有人谈论这种情况。

我有一个 table 那将被分成 2 列。 对于 2 列分区,任何人都可以显示间隔的示例吗?

在这种情况下我只有一个。 对于此示例,我如何使用具有 2 列的间隔

 INTERVAL( NUMTODSINTERVAL(1,'DAY'))

我的table:

create table TABLE_TEST
(
PROCESS_DATE DATE GENERATED ALWAYS AS (TO_DATE(SUBSTR("CHARGE_DATE_TIME",1,10),'yyyymmdd')),
PROCESS_HOUR VARCHAR(10) GENERATED ALWAYS AS     (SUBSTR("CHARGE_DATE_TIME",12,2)),
ANUM varchar(100),
SWTICH_DATE_TIME varchar(100), 
CHARGE_DATE_TIME varchar(100),
CHARGE varchar(100),
)
TABLESPACE TB_LARGE_TAB
PARTITION BY RANGE (PROCESS_DATE, PROCESS_HOUR)
INTERVAL( NUMTODSINTERVAL(1,'DAY'))

非常感谢, 马切拉

间隔分区只能在一列上构建。

在您的情况下,您有正确的分区键列 - CHARGE_DATE_TIME。为什么要将虚拟列创建为 VARCHAR2?为什么需要在它们上创建分区键?只能在 NUMBER 或 DATE 列上构建间隔分区。

如果范围不止一列,则不能使用间隔;你会得到:ORA-14750: Range partitioned table with INTERVAL clause has more than one column. From the documentaion:

You can specify only one partitioning key column, and it must be of NUMBER, DATE, FLOAT, or TIMESTAMP data type.

我不确定您为什么要将日期和小时分成单独的列(因为日期无论如何都有时间部分),或者为什么要存储 'real' 日期和数值作为字符串;首先只使用具有正确数据类型的列会简单得多。但是假设您设置以这种方式存储数据并且需要单独的 process_dateprocess_hour 列,您可以添加第三个虚拟列来组合它们:

create table TABLE_TEST
(
  PROCESS_DATE DATE GENERATED ALWAYS AS (TO_DATE(SUBSTR(CHARGE_DATE_TIME,1,10),'YYYYMMDD')),
  PROCESS_HOUR VARCHAR2(8) GENERATED ALWAYS AS (SUBSTR(CHARGE_DATE_TIME,12,2)),
  PROCESS_DATE_HOUR DATE GENERATED ALWAYS AS (TO_DATE(CHARGE_DATE_TIME, 'YYYYMMDDHH24')),
  ANUM VARCHAR2(100),
  SWTICH_DATE_TIME VARCHAR2(100), 
  CHARGE_DATE_TIME VARCHAR2(100),
  CHARGE VARCHAR2(100)
)
PARTITION BY RANGE (PROCESS_DATE_HOUR)
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
(
  PARTITION TEST_PART_0 VALUES LESS THAN (DATE '1970-01-01')
);

Table table_test created.

我还将您的字符串数据类型更改为 varchar2 并添加了一个虚构的初始分区。 process_hour 可能希望成为数字类型,具体取决于您将如何使用它。因为我不知道您为什么选择当前的数据类型,所以很难说什么才是更合适的。

我真的不明白为什么您希望分区范围是每小时,而间隔是一天,除非您希望分区是从中午到中午;在这种情况下,初始分区 (test_part_0) 必须指定该时间,而您的范围指定仍然是错误的。