ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3709284 データ削除の方法
質問者:pencil123 オラクルのデータベース容量を減らす為に、SQL PLUSにてDELETE文を実行(テーブル別に)しました
(テーブルの中身、全件削除ではなく条件に一致した不要なデータのみ削除)
条件に該当するデータは消えましたが、オラクルデータベース自体の容量が逆に増えていました
正しいデータの削除方法を教えて頂きたいのですが。宜しくお願いいたします

データベース:ORACLE 9I DATABASE
困り度:
  • すぐに回答を!
質問投稿日時:
08/01/24 14:27
この質問に対する回答は締め切られました。

回答良回答10pt

ANo.4 再編成については詳細な回答がありましたがもう一つ、コアダンプやトレースファイル、アラートファイルといった
「放って置くと溜まる一方」で不要なファイルのクリーニング(削除)もそれなりに効果が見込めるかもしれません。
もし意識されていないのであれば、一度確認することをオススメします。
回答者:lond_nag
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
08/01/25 18:39
この回答へのお礼ご回答どうもありがとうございます。
ファイルのクリーニングも調べてやってみます。
また、何かありましたら宜しくお願いします。m(_ _)m

回答良回答20pt

ANo.3 やはりディスクの空きを増やすのが目的でしたか。

一般的に再編成と呼ばれる作業となります。
まあ、だいたい、以下のような作業が必要となります。

・dba_data_filesを参照し現状のデータファイルのサイズを確認。
・dba_free_spaceを参照し現状の空き状況をを確認。
・再編成対象の表領域に存在するオブジェクトを確認する。

パターン1(resize)
表領域の空きがある場合はデータファイルのサイズを変えてるだけでOK。

・表領域のサイズを変更。
alter database datafile 'データファイル(フルパス)' resize サイズ;

パターン2(再作成)
・表領域単位でテーブルをExportする。
・対象の表領域のテーブルを削除する。
・対象の表領域を削除する。
・対象の表領域を再作成する。※サイズを小さくする。
・対象の表領域にテーブルをImportする。

パターン3(move and rebuild)
・ワーク用の表領域を作成する。
・再編成を行う表領域に存在するテーブル・索引をワーク用の表領域に移す。
 表:alter table テーブル名 move tablespace ワーク表領域名;
 索引:alter index 索引名1 rebuild tablespace ワーク表領域名;
・表領域のサイズを変更。
alter database datafile 'データファイル(フルパス)' resize サイズ;
・元の表領域にテーブル・索引を戻す。
 表:alter table テーブル名 move tablespace 元の表領域名;
 索引:alter index 索引名1 rebuild tablespace 元の表領域名;
・ワーク用の表領域を削除する。
 ※表領域削除後、データファイルも削除する。

・テンポラリーの再編成
9iだからテンプの情報はdba_temp_filesだと思います。

・新規にテンプ領域を作成する。
・ユーザーに割り当てられているテンプを変更する。
alter user scott temporary tablespace 新テンプ;
・旧テンプをdropする。
 ※表領域削除後、データファイルも削除する。

それなりに詳しくないとできない作業なので、検証環境などで
試したから作業を行うことをお勧めします。
回答者:3rd_001
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/01/25 17:35
この回答へのお礼ご丁寧な説明大変ありがとうございます。
アドバイスいただいた内容を調べてやってみます。
また、何かありましたらご質問いたします。m(_ _)m

回答

ANo.2 データベース容量とは何を想定して書いているのでしょうか?

・表領域に割り当てられたデータファイルのサイズ
・表領域内の割り当て済みデータブロック
・表の割り当て済みデータブロック

テーブルにDelete文を発行しても表のサイズは変わりません。
表に割り当てられたエクステント内のデータブロックが開放されるだけです。表のサイズが変わらなければ表領域もデータファイルも変わりません。

具体的に何をしたいのかがわからないと対応は異なります。
以下のうちのなにをしたいのでしょうか?

・表領域内の空きを増やしたい。
・表内の空きを増やしたい。
・OS上のディスクの空きを増やしたい。

※文脈からするとディスクの空きを増やしたいのかなーと予測してます。おそらくDelete文の負荷が高くて、TEMP表領域(のデータファイル)が拡張してディスクが圧迫されたのかと予測してます。
回答者:3rd_001
種類:補足要求
どんな人:経験者
自信:参考意見
回答日時:
08/01/24 16:44
この回答への補足ご回答有難うございます。ご推察の通りです。
os上のディスクの空きを増やしたいです。
DELEAT文の負荷が高いとTEMP表領域データファイルが拡張すると言うことでしょうか?それを解決してディスクの空きを増やすにはどうすればいでしょうか?
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 DELETE文のあとにCOMMIT文を実行しましたか。
それなら何の問題もありません。
回答者:toshi_2000
種類:回答
どんな人:経験者
自信:自信あり
回答日時:
08/01/24 15:24
この回答へのお礼COMMIT文は実行しましたが、ORACLE DB 自体の空き容量が増えないんです。(><)