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_date
和 process_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
) 必须指定该时间,而您的范围指定仍然是错误的。
我试图在 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_date
和 process_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
) 必须指定该时间,而您的范围指定仍然是错误的。