私のアプリケーションの性質は、大規模なデータセットを毎日削除してOracle 12cデータベースに一括して挿入することです。私のテーブルは日付フィールドで区切られ、分割インデックスされています。私はストアドプロシージャを使用して、各実行後に影響を受けたパーティションの統計を収集します。最近、実行がかなり減速していて、これがデータベースのサイズの増加によるものかどうか疑問に思っていました。Oracle 12c:無駄なディスク容量とパフォーマンス
私は私のテーブルが使用し、通常は、この到着総ディスク容量の計算方法で検索しました:
select sum(bytes)/1024/1024/1024
from dba_segments
where owner='SCHEMA' and segment_name in ('TABLE_A', 'TABLE_B');
はしかし、数字は巨大であり、使用される実際のデータ量を反映していません。復元用のテーブルを別のデータベースにエクスポートしたとき、そのファイルはそのクエリが示唆するものよりはるかに小さかった。私は深く掘って、代わりにこのクエリに到着しました:
select partition_name,
blocks*8/1024 size_m,
num_rows*avg_row_len/1024/1024 occ_m,
blocks*8/1024 - num_rows*avg_row_len/1024/1024 wast_m
from dba_tab_partitions
where table_name='TABLE_A';
このクエリは、バルク挿入を実行し、それが再び交換される前にデータを削除した後、使用スペースが再利用されていない「無駄な」スペースという概念があることを示唆しています。
したがって、私は、次の質問がある:私はdelete from table where ..
を実行 とき
- は「無駄な」スペースは、パフォーマンスの低下に貢献していますか?
- を実行すると、「無駄な」領域に関してパーティションを削除するのに比べて、
delete from table where ..
と異なる点がありますか? - 定期的に表の再編成/デフラグを実行して、表スペースを再利用することを推奨しますか?
削除部分または挿入部分に時間がかかりますか?分割統治。 Oracleはデータが次回挿入されるときにファイルを増やす時間を無駄にする必要がないため、空き領域が良いことだと思います。 (しかし私はOracleの専門家ではない) –