web-dev-qa-db-ja.com

同じデータを削除してから挿入すると、テーブルのサイズが無制限に大きくなる

テーブルを作成して、データを入力します。

create table tab
as
select 'value' || level val
from dual
connect by level <= 10000;

次に、すべての行を削除して同じデータを挿入した場合:

delete from tab;

insert into tab
select 'value' || level val
from dual
connect by level <= 10000;

commit;

テーブルサイズは、削除後挿入が実行されるたびに増加します。これらの操作を複数回実行すると、テーブルが元のサイズの何倍にも成長します。

サイズは(ほぼ)同じままであると思います。なぜこうなった?

削除はスペースを空きとしてマークし、実際にはセグメントを縮小しません。後続の挿入では、最初にHWMの下の使用可能な空のブロックを使用する必要があります。

alter table tab shrink spaceを使用してスペースを回復できます。

Oracle 12およびOracle 18cでテストしました。

5
Adamantium

My Oracle Supportにアクセスできる場合:

テーブルが使用するスペースは、削除/挿入操作を繰り返しても再利用されません(Doc ID 1601805.1)

したがって、そこからコンテンツをコピーして貼り付けるだけでなく、上記のメモは次のように述べています。

  • スペース管理アルゴリズムは、すでに割り当てられているが空きスペースを再利用するよりも、より多くのスペースを割り当てることを優先します
  • これはバグではなく機能です。これは設計方法です
  • すでに発見したように、縮小を使用してセグメントを圧縮できます
7
Balazs Papp

削除を使用する代わりに、TRUNCATE TABLEコマンドを使用します。

0
PV22