CREATE TABLE emp (
empno NUMBER(4),
ename VARCHAR2(30),
sal NUMBER
)
PARTITION BY RANGE(empno) (
partition e1 values less than (1000));
begin
for k in 2..200
loop
execute immediate
'alter table emp add partition e'||k||' values less than ('||k*1000||')';
end loop
end;
更新: 11g には、範囲パーティションの間隔を指定する機能があり、テーブルに挿入するとパーティションが作成されます。
しかし、私はそれが好きではなく、次の 2 つの理由からお勧めしません。
1 参照であるため、常に最初のパーティションを保持する必要があります。ドロップしようとすると、次のようになりますSQL Error: ORA-14758: Last partition in the range section cannot be dropped
。
2パーティション名(AFAIK)と間隔(これは醜い)を制御できません。将来誤って値を挿入すると、一部のパーティションがスキップされ、ファット パーティションが取得されます:
(少し調べたところ、ファット パーティションはありません。例に追加されました。)
Create table Z_TB_PART_TEST(
id number
)
partition by range(id)
interval(1000)
(
PARTITION PART_01 VALUES LESS THAN (1000)
);
INSERT INTO Z_TB_PART_TEST values (1500);
INSERT INTO Z_TB_PART_TEST VALUES (10000);
INSERT INTO Z_TB_PART_TEST VALUES (5000);
SELECT partition_name , high_value
FROM USER_TAB_PARTITIONS
WHERE table_name = 'Z_TB_PART_TEST';
PART_01 1000
SYS_P141 2000
SYS_P142 11000
SYS_P143 6000
UPDATE2 : Nicholas Krasnov は、ポイント 1 の回避策をコメントで示しました。
ORA-14758はどうですか?これは簡単に回避できます。一時的に間隔分割テーブルを範囲分割テーブルに変換し ( alter table tb_table_test set interval()
)、パーティションを削除してから、間隔分割テーブルに戻します ( alter table tb_part_test set interval(1000)
)。
それは動作します、私はそれをテストしました。ただし、すべてのパーティションがフリーズすることに注意してください。それらは範囲パーティションになります。ギャップがある場合は残ります(ギャップにパーティションは追加されません)。したがって、参照パーティションは、に変更する前の最後のパーティションになりinterval
ます。エラーの内容は次のとおりですLast partition in the range section cannot be dropped
。
したがって、すべての利点を備えた範囲パーティション化のセクションと間隔パーティション化のセクションがあります。