人に聞けない痔の悩み、これでスッキリ >>

いつもお世話になっております。

今使用している表領域の使用率が高くなってきたため、
不要なテーブルやデータを削除しました。

ですが、少ししか使用率が減らず困っています。

テーブルを削除した際にはPURGE RECYCLEBINで、BIN~のテーブルも
消しています。

何か他に原因があるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

前の方のおっしゃるとおり、DELETEしただけでは領域は開放されません(ハイウォーターマークが下がらない)ので、以下を試してみてください。



1.該当テーブルの全件削除で良い場合
truncate テーブル名 drop storage;
を実行する。
これで領域も開放されます。(最後のところをreuse storageとすると領域保持する意味となる)

2.部分的にdeleteして、領域を開放したい場合
alter table テーブル名 enable row movement;
alter table テーブル名 shrink space cascade;
alter table テーブル名 disable row movement;
を実行する。
1行目は領域開放の前準備、3行目は1行目の変更を元に戻す意味。
2行目でcascadeしておくと、関連インデックスの領域も一緒に縮小してくれます。
    • good
    • 10

表領域の使用率はどのようにして確認されましたか?



仮に表を削除しても、見た目の使用率は変わりません。
これは、表のデータを DELETE しただけではハイ・ウォータ・マーク (HWM) が下がらないのと同じことです。
    • good
    • 4

多分、その雰囲気では


ゴミ箱はクリアされていますね。
あとは、インターネット一時ファイルの
可能性はないですか?

IEの、ツール
インターネットオプション
真中あたりの
「ファイルの削除」を
実行しても同じでしょうか?
    • good
    • 14

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QOracleのsystem表領域について

ORACLE初心者です。

system表領域がいっぱいになる現象が発生しました。(使用率98%)
原因調査を依頼されましたが、system表領域がどのような要素で
構成され、増えていくのか分かりません。

(環境)
Windows2000Server
Oracle 8.1.6 WorkGroupServer

ユーザのデフォルト表領域はちゃんと指定しているとの事です。
何か情報がありましたら、教えていただきたくお願いします。

Aベストアンサー

SQL*PLUSを起動し、一般ユーザが使用しているユーザIDで
ログインしてください。

そして、
select table_name,tablespace_name
from user_tables;
を実行します。

テーブル名と表領域名が表示されますので、表領域systemを
占有しているテーブル名がわかるかと思います。

Qデータ削除の方法

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

データベース:ORACLE 9I DATABASE

Aベストアンサー

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

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

・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する。
 ※表領域削除後、データファイルも削除する。

それなりに詳しくないとできない作業なので、検証環境などで
試したから作業を行うことをお勧めします。

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

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

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

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

・表領域のサイズを変更。
alter database datafile 'データファイル(フ...続きを読む

QSYSユーザーでログインしたい

SQL plusでSYSユーザーでログインするにはどうすればよいのでしょうか?
SYSTEMユーザーやSCOTTユーザーではログインできるのですが、SYSユーザーになる方法がわかりません。
お願いします。

Aベストアンサー

>SQL plusでSYSユーザーでログインするにはどうすればよいのでしょうか?
特別なことする必要がないと思います。
ログインできない場合いろいろな原因が考えられます。
一番可能な原因は設定によってSYSユーザーNOMAL権限でログインできない場合あります。
この場合
sqlplus sys/パスワード@接続文字列 as sysdba
で試してください。


>SYSTEMユーザーやSCOTTユーザーではログインできるのですが、SYSユーザーになる方法がわかりません。
conn sys/パスワード@接続文字列 as sysdba

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

QOracleのテーブルサイズ

Oracle(8.0.5以降)で、テーブル毎のサイズを知りたいのですが、どこにその情報はあるのでしょうか?
テーブルが拡張されてそれぞれどの程度のサイズになっているのか、また、何%程度使用しているのか等が知りたいのです。
以前に、Oracleのシステムテーブルにそのような情報をもっていると聞いたことがあるのですが、わかりません。
どなたかわかる方がいましたら、よろしくお願い致します。

Aベストアンサー

簡単に調べる方法があります。
以下のSQL文をSQL*Plus等で実行してみてください。

select segment_name,trunc(bytes/1024,0) kb
from user_segment
where segment_name='*****'
/

*****に目的のテーブル名を設定します。
テーブルのサイズがKバイト単位で表示されます。
バイト単位で知りたい場合は、trunc(bytes/1024,0)をbytesに
置き換えます。

Q索引の再構築をすべき?

とあるプロジェクトに放り込まれた新人SEです。
当該PJでは、客先にDBを構築して納入しているのですが、最近動作が遅くなってきたというクレームを耳にしました。調べてみると、特定のテーブルのSelect処理に時間がかかっているようです。問題のテーブルは、毎日数十万件のデータがInsertされ、一定の保持期限より古いデータは毎日削除されます。
問題はここからで、索引は設定されていますが、それをメンテしているという話を聞かないのです。
ちなみに、日付に対応するパーティションがあり、表・索引ともにパーティションで管理されています。毎日深夜に一番古いパーティションを削除し、翌日分のパーティションを新規作成するデーモンが動きます。
OracleSilver挑戦中の頭で一生懸命考えたのですが、納入から時間が経っているので索引が凄いことになっているのでは・・・という考えと、毎日新しいパーティションが生成されてるから大丈夫なのでは・・・という根拠の無い考えが渦巻いています。
アドバイス、お願いできますでしょうか。

Aベストアンサー

>CBOでは実行計画の最適化には統計情報が使われるのですか・・・!
>ということは、定期的にANALYZEしないとボケた実行計画を選択してしまう、ということですか。
>(ちなみにCBO or RBOは少し調べて理解したのですが、どこかで明示されているんでしょうか?)

CBOは、原則として、統計情報が必要です。
統計情報にあるテーブル/インデックスの特性と実態が異なるようなケースでは、
統計情報が悪さをして、まともな実行計画が立案できません。
なので、テーブルの登録内容が大きく変わる場合は、統計情報の更新を行う必要が
あります。
ただし、統計情報が一度も採取されていないテーブルやインデックスについては、
CBOは、類推して、実行計画を算定します。
これが偶々良い方向で実行計画に作用する場合も無いとは限りません。
少なくとも、大嘘付きの統計情報を使うくらいなら、ない方がましかもしれません。


現在どのオプティマイザを使っているかは、初期化パラメータに
指定があるはずです。(デフォルトはCHOOSE)
特定のSQLのみルールベースにしたり、コストベースオプティマイザの種類を変更したり
というのは、オプティマイザヒントで行えるので、統計情報が信頼できず、
統計情報の更新タイミングが持てないような運用の場合、ヒントで切り抜けるのが
ラクな解決法だと思います。
少なくとも、他への影響がないので。

>CBOでは実行計画の最適化には統計情報が使われるのですか・・・!
>ということは、定期的にANALYZEしないとボケた実行計画を選択してしまう、ということですか。
>(ちなみにCBO or RBOは少し調べて理解したのですが、どこかで明示されているんでしょうか?)

CBOは、原則として、統計情報が必要です。
統計情報にあるテーブル/インデックスの特性と実態が異なるようなケースでは、
統計情報が悪さをして、まともな実行計画が立案できません。
なので、テーブルの登録内容が大きく変わる場合は、統計情...続きを読む

Q実行計画の「COST」と「BYTE」について教えていただきたいです。

実行計画の「COST」と「BYTE」について教えていただきたいです。

書籍には
COST・・・・CBOによって見積もられた操作コスト。
BYTE・・・・アクセスされるバイト数のCBOのアプローチによる見積もり。
と書かれていますが、いまいちピンときません。


私は、
COSTは、検索するテーブルのデータ量が多いほうがコスト値が大きくなる。
BYTEは、検索条件に合致して取得できるデータが多いほうがバイト値が大きくなる。
と思っているのですが、正しいでしょうか?

Aベストアンサー

このあたりを参考にしてください。
COSTはデータ量だけではなく、その表やViewのアクセスに要する時間やSortや結合が必要なら、そのために必要なCPU時間等も考慮されています。
表があるHDDのアクセス速度なんかも考慮されているし、表のエクステントが複数になっているかとかも考慮されています。
書籍はわかりにくいかもしれませんが、嘘は少ないと思います。著者が思い違いをしてないとは言い切れませんが。

参考URL:http://otn.oracle.co.jp/forum/message.jspa?messageID=35016743

QOracleで流したSQLのログを取得できますか?

ASP+Oracle9iで作られたシステムがあります。
Oracleの設定などは前任者がしており、まともな引継ぎを受けないまま私が維持運用員となりました。
現在DBからあるレコードが消えてしまい(最初から作られてない可能性もあり)、顧客からクレームがついています。
状況から考えて怪しいプログラムを調査したのですが、原因不明でした。
そこで、Oracleの方で今まで流れたSQLをログとして保存していれば手がかりがつかめるのではないかと思い、情報を探しているのですが見つからないので教えて頂きたいのです。
私はOracleの知識(管理面について)が殆どなく、Oracleを使うことはできるが、Oracleの設定がどういう状況になっているか調べることもできず、資料もありません。

1.そもそもOracleにSQLをログとして保存する機能があるのか?
2.あるとすれば、保存機能が有効になっているか、保存したファイルがどこにあるかをどこで確認できるか?

以上の点についてご存知の方、どうぞ回答よろしくお願いします。

Aベストアンサー

OracleのSQL実行痕跡は以下に示すものの中にあります。
ただし、それぞれの設定レベル、保存方法によって、参照できる範囲は変わります。

1.オンラインREDOログとアーカイブログ
  オンラインREDOログはすべてのOracleデータベースに存在します。
  ですが、そのREDOログのサイズとシステムのアクセス量によって保存期間は変化します。アーカイブログ設定しておけば、古いREDOログはアーカイブとして吐き出されます。
  これらは#1の方がおっしゃったLOGMINERで実行済みSQLを調査することができます。
  アーカイブログモードになっているかどうかは、下記で確認できます。
   SQL> select log_mode from v$database;

  また、どのアーカイブログファイルを調査するかは下記を参照すれば良いと思います。
   SQL> select name,to_char(completion_time, 'yyyy/mm/dd hh24:mi') adate from v$archived_log;

2.フラッシュバック問い合わせ
  これは初期化パラメータUNDO_MANAGEMENTがAUTOに設定されており、かつUNDO_RETENTIONが保存期間として適切に設定されている場合のみ使用できます。
  やっていることは、UNDO表領域(旧RBS用表領域)の中に残っている実行履歴を参照しています。したがって、データベース設計時にフラッシュバック問い合わせを前提としていない限り、使える可能性は低いです。

3.その他
  監査を実行していれば、実行SQLを取得できる可能性があります。
  ただし、監査レベルなどを理解しておかないと、すべてのSQLが取得されていない可能性がありますので、難しいかもしれません。

OracleのSQL実行痕跡は以下に示すものの中にあります。
ただし、それぞれの設定レベル、保存方法によって、参照できる範囲は変わります。

1.オンラインREDOログとアーカイブログ
  オンラインREDOログはすべてのOracleデータベースに存在します。
  ですが、そのREDOログのサイズとシステムのアクセス量によって保存期間は変化します。アーカイブログ設定しておけば、古いREDOログはアーカイブとして吐き出されます。
  これらは#1の方がおっしゃったLOGMINERで実行済みSQLを調査することができま...続きを読む

Q大量レコードをTRUNCATEせずにすばやく削除する方法

大量レコードをTRUNCATEせずにすばやく削除する方法


100万レコードあるテーブルのうち1万レコードを残して削除したい。TRUNCATEではWHERE句が指定できないので不可。DELETEでは遅すぎる。何かいい方法はないでしょうか?

1万レコードを一時テーブルに退避してTRUNCATE後に1万レコードをINSERTというのは無しです。1万レコードが1秒でもテーブル上から消えてはいけません。

Oracle10g

Aベストアンサー

残したいデータ(レコード)に共通点があれば可能です。
予めパーティションテーブルとしておいて、
残したいデータのみを挿入するパーティションとそれ以外のパーティション定義とします。
パーティションレベルでのTRUNCATEやDROPであれば一瞬でできますし、
必要としている1万行が消えることも一切ありません。

ただし、EEのオプションとなりますが。
EEを買っていないのであれば各パーティションに相当するテーブルを作って
テーブルとテーブルをUNIONするVIEWを作る形になります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング