【发布时间】:2018-10-26 04:54:50
【问题描述】:
我正在通过 ETL 工具运行并发插入查询(同时 12 个查询)以将数据插入到 Oracle 中的分区表中。
表定义是
CREATE TABLE CUST_TRAN
(
TRAN_SEQ_NO NUMBER(20,0)
, TRAN_DATE DATE
)
TABLESPACE USERS
STORAGE (INITIAL 256K NEXT 256K)
PARTITION BY RANGE (TRAN_DATE)
INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
(
PARTITION CUST_TRAN_p_old VALUES LESS THAN (TO_DATE('1-1-2008', 'DD-MM-YYYY'))
)
这 12 个查询针对 4 个不同的日期运行(每个日期 3 个查询)。因此,12 个查询试图插入 4 个分区。这是示例插入查询 -
insert into cust_tran
select a.tran_seq_no, trunc(a.tran_datetime) as tran_date
from table_a a
inner join table_b b on a.store = b.store
and a.tran_seq_no = b.tran_seq_no
and trunc(a.tran_datetime) = to_date('2018-01-31', 'YYYY-MM-DD')
and a.tran_type in ('SALE')
但是,我一直遇到以下问题之一 -
1) 我收到此错误 - ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions
或者
2) 作业运行良好,没有任何错误,但是将数据插入到 CUST_TRAN_SUMM_p_old 分区中,其中包含一个奇怪的日期,该日期不存在于任何源查询中,并且该日期不存在于源表中。那个奇怪日期的确切值很难说,因为当我使用 SQL Developer 并将日期格式化为 YYYY-MM-DD HH24:MI:SS(在工具 > 首选项 > 数据库 > NLS 中)时,它显示为 null 但当我将显示格式更改为 DD-MON-RR HH24:MI:SS 时,它显示 29-NOV-01 22:58:59。当我使用 DBeaver 时,它显示为 10101-11-29 22:58:59。当我使用 Toad for Oracle 时,它显示为 1/1/0001。
第一个问题真的很奇怪,因为我在过滤器中提供了日期,它无法获取另一个不在过滤器中的日期。另外,我在新创建表格后运行它。因此,它不可能达到最大分区数(1,023,999)。
第二个问题同样奇怪。
这是 Oracle 中的错误吗? Oracle 中是否有一些设置需要更改?使用并发插入查询将数据插入分区表有错吗?
【问题讨论】:
-
据我所知,如果插入操作有多个来源,应该没有问题(你的那种)。你查过源吗?到底是什么?你能在里面找到日期“10101-11-29”吗?
-
这听起来很奇怪,不应该发生。好消息是,几乎可以肯定它不会发生。但是,如果您希望我们解释实际发生的情况,则需要发布可重现的测试用例。
-
什么是
10101? - 它不能是一年、一个月或一天.... 以DD-MM-YYYY格式发布您的日期 -
@MarmiteBomber - 当我使用 SQL Developer 并将日期格式化为 YYYY-MM-DD HH24:MI:SS 时,它显示为空。当我使用 DBeaver 时,它显示为 10101-11-29 22:58:59。
标签: oracle plsql partitioning database-administration oracle11gr2