2016-11-23 42 views
2

私のアプリケーションの性質は、大規模なデータセットを毎日削除して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 ..を実行 とき

  1. は「無駄な」スペースは、パフォーマンスの低下に貢献していますか?
  2. を実行すると、「無駄な」領域に関してパーティションを削除するのに比べて、delete from table where ..と異なる点がありますか?
  3. 定期的に表の再編成/デフラグを実行して、表スペースを再利用することを推奨しますか?
+0

削除部分または挿入部分に時間がかかりますか?分割統治。 Oracleはデータが次回挿入されるときにファイルを増やす時間を無駄にする必要がないため、空き領域が良いことだと思います。 (しかし私はOracleの専門家ではない) –

答えて

1

テーブルから削除を実行すると「無駄な」スペースがパフォーマンス低下に影響しますか?

はい、あなたはOracleが作るハイウォーターマーク、までの基本となるテーブルの上に完全TABLスキャン/索引レンジ・スキャン(索引リーフ・ノードの空のブロックにつながる可能性を)実行するようにしているテーブルから削除されているあなたの遅い削除。

"無駄な"スペースに関してパーティションを削除するのと比べて、どこからテーブルを削除するかに違いはありますか?

削除は遅い処理です。イメージの作成(元に戻す)、索引の更新、​​REDOログの書き込み、およびデータの除去が必要です。DDL(Drop)はREDO/UNDO(メタデータのUNDO/REDOの小さなビットを生成)を生成しないので、DML(削除)より高速です。

表スペースを再利用するために、定期的に表再編成/デフラグを実行していることをお勧めしますか?

フラグメント化された空き領域を持つオブジェクトは、無駄なスペースをもたらし、データベースのパフォーマンスに影響を与える可能性があります。このスペースを最適化するには、オンラインセグメントの縮小を実行するのが好ましい方法です。詳細について

Reclaiming Unused Space

次のブログ記事は、それを取り除くために無駄なスペースと方法のbecuase DML時のパフォーマンスへの影響をdemostrate。

Defragmentation Can Degrade Query Performance

1

削除や更新を行っていると、領域が断片化しています。 documentationでそれについて読むことができます。

プロセスを改善するには、shrinkのようなクリーニング操作を実行するか、いくつかの大きなインサートでテーブルを再作成するだけです。私は、削除と挿入を行う代わりに、古いテーブルを選択して削除するテーブルを作成しないで、新しいテーブルを新しいテーブルに挿入することを意味します。その後、名前を交換して古いテーブルを削除します。

あなたの2番目の質問で私は答えがhereだと思います。パーティションを削除するとHWMが減少し、削除されません。

0

このクエリは、一括挿入を実行し、それが再び交換される前にデータを削除した後、使用スペースが再利用されていない「無駄な」スペースという概念があることを示唆しています。

これは正しいです。

ダイレクトパスインサートは、セグメントの最高水位より上のスペースを使用します。その後の削除で行は削除されますが、最高水準点はリセットされません。

別のダイレクトパス挿入を実行する前にセグメントを切り捨てることができれば、最高水準点がリセットされ、すべての行が削除されるため、最適な方法です。

関連する問題