web-dev-qa-db-ja.com

SQLエラー:ORA-14300:パーティション化およびサブパーティション化中

私はこれを以前に試しましたが、うまくいきます:

  • DATEに分割され、STATEにサブ分割される必要があるDATEまたはSTATEがないT1があります。
  • したがって、T1に存在するIDについて、T2から日付と状態をフェッチします。
  • DATEキーでT1のパーティションフォームであり、STATEキーでサブパーティション化された新しいテーブルT3を作成します。
  • T1からすべてのレコードをプルし、2つの列DATEとSTATEだけでなく、T3にすべての行を挿入します。しかし、それぞれのパーティション/サブパーティションでも

私のデータはこのように保存されています。

enter image description here

次のcreateステートメントを使用してテーブルを作成しました_T3_

_CREATE TABLE SLABELSVALUE 
(   "DOC_ID" VARCHAR2(80 BYTE) NOT NULL ENABLE,
...
...
"DOC_DATETIME" DATE NOT NULL ENABLE, //additional in T3 compared to T1
"DOC_STATE" VARCHAR2(5 BYTE),  //additional in T3 compared to T1
CONSTRAINT...
PARTITION BY RANGE (DOC_DATETIME)  
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))  **Line added for auto partition
SUBPARTITION BY LIST (DOC_STATE)
 SUBPARTITION TEMPLATE(
 SUBPARTITION IN_PB VALUES('IN-PB') , //All states 
 SUBPARTITION IN_RJ VALUES('IN-RJ') ,
 ...
)  
(
PARTITION p0 VALUES LESS THAN (TO_DATE('01-MAY-2006','DD-MON-YYYY'))
//Ealier when it worked I defined all partitions for testing,
//When I included above lines `**` for auto partitioning it doesn't work
);
_

私の試用シナリオでは、Intervalパーティション分割メカニズムを含めなかったときに機能しました。

また、テスト用にすべてのパーティションを明示的に定義しました。

  • 1 TBを超えるプロダクションに_T1_データがあります。
  • 毎月10億行
  • 2006年の最初のデータ

エラーの概要

今何をしようとしているのですか?

この日付までの10年X 12(月)パーティションについては、明示的に言及したくありません。したがって、INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))が含まれており、今後数か月間パーティションを明示的に定義したくありません。

そして Oracle に従って最初のパーティションを定義しました

今何が問題なのですか?

ORA-14300:パーティション化キーは、許可されている最大パーティション数を超えたパーティションにマップされます

NULL値をチェックしましたか

はい、他のブログが列のNULL値をチェックしたことを示唆しているので、何もありません。

私が疑うことは?

インターバル・パーティション化では、サブパーティションはサポートされない場合があります。

エラーを生成するステートメントは次のとおりです。

_INSERT INTO T3
SELECT T1.*, T2.DOC_DATETIME, T2.DOC_STATE
FROM T1
LEFT OUTER JOIN T2
ON (T1.DOC_ID =  T2.DOC_ID)
WHERE T2.DOC_DATETIME BETWEEN '01-APR-06' AND SYSDATE;
_

1行目からINSERTを削除してSELECTを保持すると、出力が得られます。

テーブル構造:

_T1 (Doc_ID varchar not null PK, label_ID varchar not null, label_val varchar not null)
T2 (DOc_ID varchar not null PK, Doc_State varchar not null, Doc_date DATE not null)
T3 (DOC_ID...,label_ID...,label_val..., Doc_State..., Doc_Date)
_

解決策があれば教えてください。

3
Some Java Guy

すべての範囲パーティションを明示的に定義する必要がありました。時間隔パーティション化は、サブパーティション化テンプレートではうまく機能しませんでした。

Oracleは、インターバルパーティションに対して1mパーティションのハード制限を行います。

パーティションを次のように定義しました

PARTITION jan06 VALUES LESS THAN (TO_DATE('01-FEB-2006','DD-MON-YYYY')),
...
ALL THE WAY FOR NEXT 20 YEARS..
...
PARTITION jan26 VALUES LESS THAN (TO_DATE('01-FEB-2026','DD-MON-YYYY')),

here および there を参照してください

2
Some Java Guy