マンガでよめる痔のこと・薬のこと

DB2で、テーブルのサイズやスキーマのサイズ(実際にデータが何MBあるのか)を知りたいです。

ご存知の方、いらっしゃいましたら、教えて下さい。

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

A 回答 (2件)

ちょっと希望に添えないかもしれませんが、REORGCHKコマンドを実行すると、副作用として表のサイズが一覧表示されるので(TSIZEのところ)、使えるかもしれません。

    • good
    • 0

$ db2 list tablespaces show detail

    • good
    • 0

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

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

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

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

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

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

QDB容量の確認方法

Oracle初心者です。
DBの全容量や今利用している容量(データが蓄積された分)や
残ってる容量などを確認したいのですが、
どのような方法が適切なのでしょうか?

ネットなどで見ても、今ひとつよく分からなかったので
質問させて頂きました。よろしくお願いします。

Aベストアンサー

DBの容量は、意外と分かりやすいものです

でも、Enterprise ManagerなどのGUIをつかよりも、
SQL を使ってコマンドで調べてみましょう

◆ お答えします

まず、DBのデータは、ファイルに格納されています

ASMのケースもありますが、まずは、通常のファイルシステムの
場合でお答えします


DB容量は、

[______________________________________]
まず、このように全部で格納でいるファイルを作ります。
そのファイルを、データファイル といいます。

そのデータファイルをまとめた入れ物が
テーブルスペースといいます。日本語では、表領域です。

そして、その表領域に、テーブルを作成して、行を格納します

[■■■■■■__________________________]
このように格納されます。(イメージ図です)

この時、2つの尺度があります。

1つ目は、
データファイルがまとまった表領域のサイズがどれくらいで、
その内、どれくらの割合を使われているか

*これは、あとどれくらいで満杯になるかが分かります

[■■■■■■__________________________]
であれば、30%ぐらいでしょうか・・・

2つ目は、
データファイルがまとまった表領域の中で
既に使用済みのテーブルの、空き具合は、どうなっているのか?

*これは、どれくらい、無駄に使っているのかが分かります

実際の現場では、1つ目の確認だけをやれば
まず大丈夫です


◆ では、実際にやってみましょう

データファイルがまとまった表領域のサイズがどれくらいで、
その内、どれくらの割合を使われているかを求めるSQL文


select ddf.TABLESPACE_NAME,
ddf.BYTES,
ddf.BYTES-DFS.BYTES "BYTES_USED",
round(((ddf.BYTES-dfs.BYTES)/ddf.BYTES)*100,2) "PERCENT_USED",
dfs.BYTES "BYTES_FREE",
round((1-((ddf.BYTES-dfs.BYTES)/ddf.BYTES))*100,2) "PERCENT_FREE"
from (select TABLESPACE_NAME,
sum(BYTES) bytes
from dba_data_files
where autoextensible='NO'
group by TABLESPACE_NAME) ddf,
(select TABLESPACE_NAME,
sum(BYTES) bytes
from dba_free_space
group by TABLESPACE_NAME) dfs
where ddf.TABLESPACE_NAME=dfs.TABLESPACE_NAME
order by ((ddf.BYTES-dfs.BYTES)/ddf.BYTES) desc

実行結果

列の意味
TABLESPACE_NAME 表領域の名前
BYTES       表領域のサイズ
BYTES_USED     表領域の使用済みサイズ
PERCENT_USED    使用済みの割合
BYTES_FREE    まだ使えるサイズ

WHERE句の意味

where autoextensible='NO'
これは、データファイルの空きが0になったら、
自動拡張するかどうかです。これが、NOなので
今回は自動拡張しないものを、SELECTしています



TABLESPACE_NAME BYTES BYTES_USED PERCENT_USED BYTES_FREE
------------------------------ ---------- ---------- ------------ ----------
PERCENT_FREE
------------
APPS_TS_SEED 3126853632 3061055488
97.9 65798144
2.1

APPS_TS_TX_DATA 5956042752 5764939776
     96.79 191102976
3.21

SYSAUX 497745920 468385792
94.1 29360128
5.9

APPS_TS_TX_IDX 8112570368 7470710784
92.09 641859584
7.91


今回のサンプルでは、
どれも90%を超えているので、これから表領域のサイズを広げる必要がありますね・・・

表領域を広げるには、
  データファイル自体のサイズを広げる
  新たに別のデータファイルを追加する
などがあります。


Your DBA MOTO:TAKER

DBの容量は、意外と分かりやすいものです

でも、Enterprise ManagerなどのGUIをつかよりも、
SQL を使ってコマンドで調べてみましょう

◆ お答えします

まず、DBのデータは、ファイルに格納されています

ASMのケースもありますが、まずは、通常のファイルシステムの
場合でお答えします


DB容量は、

[______________________________________]
まず、このように全部で格納でいるファイルを作ります。
そのファイルを、データファイル といいます。

そのデータファイルをまとめた入れ物...続きを読む

QDB2のコマンドラインexportで複雑なselectの指定は可能?

オラクルだとspoolでselect文の出力結果をCSV形式等にして取得できるのですが、DB2で同じ事が可能かと調べてます。db2コマンドのexportを使えばできそうかと思うのですが、複雑なselect文の時にコマンドラインに全部書かなければならないのか、他に手段があるのか、悩んでいます。

Aベストアンサー

export コマンドを使ったCVS形式でのファイル出力    →できます
コマンドラインではなく外部ファイルを使用したSQLの実行 →できます

具体的なやり方
以下のファイル(hoge.txt)を作成する。
----------------------------------------------------------
connect to DB名 user DBユーザー名 using パスワード;
export to ファイル名 of del SQL文(ex select * from hoge) ;
connect reset;
----------------------------------------------------------
db2 -tvf hoge.txt

でできます。
windowsだと、db2コマンドウィンドウで、
UNIX、Linuxなら、db2インスタンスユーザー等、
db2コマンドが使える状態になっていないとできません。

参考URL:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/core/r0008303.htm

export コマンドを使ったCVS形式でのファイル出力    →できます
コマンドラインではなく外部ファイルを使用したSQLの実行 →できます

具体的なやり方
以下のファイル(hoge.txt)を作成する。
----------------------------------------------------------
connect to DB名 user DBユーザー名 using パスワード;
export to ファイル名 of del SQL文(ex select * from hoge) ;
connect reset;
----------------------------------------------------------
db2 -tvf hoge.txt

でできます。
window...続きを読む

QDB2のロック調査

作成したアプリケーション(SELECTを発行するだけ)が*LOCK開放待ち(?)でTimeOutが発生してしまいました。
他のAPPがどうもテーブルロックをしていたらしいのです。
どのAPPがいつからいつまでロックを掛けていたか?を
調査する方法を教えて下さい。
DB2のバージョンは8?OSはAIX5.x?
詳しく教えてもらえない・・・(原因は不明)すいません。

Aベストアンサー

エラーの内容はSQL0911Nで理由コードは68ですか?
であれば、ロック・タイムアウトが起きていることになります。

他のAPPがテーブルロックをしていたというのは、予期しない動作なのでしょうか?
もしロックエスカレーション(行ロックが表ロックに変換される)が起きているようであれば、
MAXLOCKSやLOCKLISTを調整したほうが良いと思います。
あるいは予期していない分離レベルでアプリケーションが動作しているため、不必要なロックを取得しているかもしれません。
分離レベルはUR、CS、RS、RRのどれでしょうか。
ちなみに分離レベルCS以上であればSELECTがLOCKWAITなのは正しい動きだと思いますよ。

ここまで気になることをずらずらと書いてしまいましたが、以下本題に戻ります。
ロックのことは通常ロック・スナップショットで調査します。

(コマンド実行例)
db2 get snapshot for locks on sample

断続的にこのコマンドを実行することで、ロックの動きがわかると思います。(なれないうちは大変だと思いますが。)

エラーの内容はSQL0911Nで理由コードは68ですか?
であれば、ロック・タイムアウトが起きていることになります。

他のAPPがテーブルロックをしていたというのは、予期しない動作なのでしょうか?
もしロックエスカレーション(行ロックが表ロックに変換される)が起きているようであれば、
MAXLOCKSやLOCKLISTを調整したほうが良いと思います。
あるいは予期していない分離レベルでアプリケーションが動作しているため、不必要なロックを取得しているかもしれません。
分離レベルはUR、CS、RS、RRのどれでし...続きを読む

QDB2のSQL(日付)について

文字列で8桁の日付(例:20041208)を持っている項目の条件に本日日付以上という条件をつけたいのですが、
(例:where NEN >= 本日日付の文字列8桁 )
※NEN:20041208
SQLでシステム日付を文字列8桁にする方法はありますか?
ご教授お願いしますm(_ _)m

Aベストアンサー

(前にも回答したと思うのですが、入っていないようなので再度入力します)

大小の比較をしたいのでしたら、DATE型を文字列にしても駄目で、文字列をDATE型に変換する必要があります。
8文字で表された日付をDATE型に変換する関数はDB2には用意されていないので、自分で用意する必要があります。

CREATE FUNCTION STR2DATE (dateString VARCHAR(8))

RETURNS DATE

SPECIFIC STR2DATE

LANGUAGE SQL

DETERMINISTIC

CONTAINS SQL

BEGIN ATOMIC

DECLARE ret VARCHAR(10);



IF (LENGTH(dateString) != 8) THEN

RETURN DATE('1970-01-01');

END IF;



set ret = LEFT(dateString,4) || '-' || SUBSTR(dateString,5,2) || '-' || RIGHT(dateString,2);



RETURN ret;

END@

という感じでSTR2DATE関数を用意しておいて、
SELECT ... WHERE STR2DATE(NEN) >= CURRENT DATE
とやればうまくいくのではないでしょうか。

(前にも回答したと思うのですが、入っていないようなので再度入力します)

大小の比較をしたいのでしたら、DATE型を文字列にしても駄目で、文字列をDATE型に変換する必要があります。
8文字で表された日付をDATE型に変換する関数はDB2には用意されていないので、自分で用意する必要があります。

CREATE FUNCTION STR2DATE (dateString VARCHAR(8))

RETURNS DATE

SPECIFIC STR2DATE

LANGUAGE SQL

DETERMINISTIC

CONTAINS SQL

BEGIN ATOMIC

DECLARE ret VARCHAR(10);



IF (LENGTH(...続きを読む

QDB2でのシステム日付のinsert、updateについて。

質問です。
DB2で、システム日付のinsert、updateを行うSQLを作成したいのですが、どのようにしたら良いでしょうか?

また、参考になるようなサイトなどありましたら教えてください。

どなたか宜しくお願いします。

Aベストアンサー

そうですか・・・。
DB2V8 FP2 on WinXPProのCLPではうまくいっていますが・・・。

(成功例)

db2 connect to sample
db2 create table hoge(no integer,date date)
db2 insert into hoge values (1,current date)
db2 update hoge set date=current date where no=1

ちなみに

db2 update hoge set date=current date where no='1'

⇒SQL0401N(SQLSTATE=42818)エラー

db2 update hoge set date=integer(current date) where no=1

⇒SQL0408N(SQLSTATE=42821)エラー

でした。
no列はINTEGER型で間違いないんですよね?
以下はどういうエラーになりますか?

db2 update hoge set date=current date

そうですか・・・。
DB2V8 FP2 on WinXPProのCLPではうまくいっていますが・・・。

(成功例)

db2 connect to sample
db2 create table hoge(no integer,date date)
db2 insert into hoge values (1,current date)
db2 update hoge set date=current date where no=1

ちなみに

db2 update hoge set date=current date where no='1'

⇒SQL0401N(SQLSTATE=42818)エラー

db2 update hoge set date=integer(current date) where no=1

⇒SQL0408N(SQLSTATE=42821)エラー

でした。
no列はINTE...続きを読む

QDB2でのロック

Oracleで今まで開発しており今回始めてDB2での開発を行うものです。

Oraleと同じロックのかけ方をDB2で行いたいのですが、どのように記述すればよろしいでしょうか。

かけたいロックは
・セレクトした対象行のみにロックをかける
・他のセッションからは、ロック前の情報を参照可能
・コミットまたはロールバックを行うまでロックを保持する
です。

よろしくお願いします。

Aベストアンサー

OracleもDB2もデフォルトのトランザクション分離レベルはRead Committedですがトランザクション制御の実装の仕方が違います。
DB2は検索時に共有ロックをかけます。しかし読み取るデータが更新中の場合はすでにそのデータに排他ロックがかかっているので共有ロックをかけることができません。
Oracleはマルチ・バージョン一貫性制御でUNDO表領域に保持された更新前の情報を読み込むので読み取るデータが更新中であっても検索処理が待たされることはありませんがDB2は更新中のデータに他クライアントはアクセスできないで検索処理が待たされます。
Uncommitted Readでダーティー・リードを許す方法がありますが実用的なアプリケーションにあまり使用されません。
ロック取得時間を短くするような排他制御のアプリケーション設計を行い検索処理と重複するタイミングを減らすことで回避するようにします。オプティミスティックロックの実装方法を用いるようになると思います。
でも頻繁に複数ユーザーが同時に同一データを変更するようなシステムだと更新に失敗する確率が高くなり利便性が悪く場合があります。

SELECT * FROM TABLE FOR UPDATE WITH RS

排他制御が必要な際はその都度、各SQL文にWITH句を用いて分離レベルを指定してください。カーソルオープン前に発行することでCOMMITかROLLBACK時までロックされた状態になります。
ロック待機への対処も異なります。ロック待機をせずすぐに制御を戻す場合、OracleはSELECT~FOR UPDATEにNOWAITオプションを指定しますがDB2ではNOWAITオプションに対応する機能をサポートしていません。ロック待機する時間をLOCKTIMEOUTパラメータで指定するしかありません。
以上の辺を確認してみてください。

OracleもDB2もデフォルトのトランザクション分離レベルはRead Committedですがトランザクション制御の実装の仕方が違います。
DB2は検索時に共有ロックをかけます。しかし読み取るデータが更新中の場合はすでにそのデータに排他ロックがかかっているので共有ロックをかけることができません。
Oracleはマルチ・バージョン一貫性制御でUNDO表領域に保持された更新前の情報を読み込むので読み取るデータが更新中であっても検索処理が待たされることはありませんがDB2は更新中のデータに他クライアントはアクセスで...続きを読む

QDB2 REORGについて

db2 reorgについての質問です。

何もわからず、どのように対処すればよいのか
全くわからないため、
とても失礼な質問になっていると思いますが
宜しくお願いいたします。

現在、db2を使用していますが、
あるテーブルの容量が逼迫しているため
対処が必要になっています。

そこで、データを削除しただけでは、
空きページ数は広がらず
REORGを使用して
サイズの編集を行おうとしましたが、
エラーとなってしまいました。

内容は、
データベース表の編成中に、SQLエラー "-289"が起きました。

どのように対処すればよろしいでしょうか?

本当に何もわからない初心者で
申し訳ありませんが
宜しくお願いいたします。

Aベストアンサー

DB2には詳しくないですが・・・。

DB2はオンラインマニュアルが公開されていますが、マニュアルを参照しましたか?

意味としては、「REORGするには、空きスペースが足らない」といった意味のようです。

参考URL(マニュアル)の60ページに、意味と対処方法が記載されています。

参考URL:http://publibfp.boulder.ibm.com/epubs/pdf/c8885440.pdf

QSQL:TIMESTAMPの期間検索を指定するには?

教えてください。

SQL文で日付期間の検索をしたいです。

フィールド名:tran_dataの値が、
2004/09/01 ~ 2004/09/03 のデータを検索したい。

データはTIMESTAMPで取得されています。
テーブル名:dat_history

【失敗例】
select * from web.dat_history where tran_date = '2004-08-18'

【エラーメッセージ】
日付値のストリング表記が間違っています。

Aベストアンサー

DBMSはなんでしょう?

とりあえずOracleの場合。

select * from web.dat_history where to_char(tran_date, 'yyyy/mm/dd') between '2004/09/01' and '2004/09/03';

ですね。

QDB2の更新ロックについて

DB2 v7を使用しています。
select文で更新ロックをかけました。
PreparedStatementとresultsetをcloseした後、同Connectionでupdate文をかけました。
このとき、select文のロックがかかってるのかわかりませんが、エラーも出ずに更新ができませんでした。
更新ロックのかけ方は 普通のselect文の最後に for updateとしただけです。updateは普通にupdateを行いました。

現在の状況としては、更新ロックがかかっているのかどうかわからないという状態です。
そこで、
(1)更新ロックがかかっているのかどうかを調べる方法があれば、その方法が知りたい。
(2)更新ロックの解除の方法をしりたい。
(3)select文で更新ロックをかけた場合の特別なupdateの方法が、その方法をしりたい。

どなたかご存知のかたがいらっしゃいましたらご教授くださいますようよろしくお願いいたします。

win2000
jdk1.3

Aベストアンサー

(1)
db2のコマンドウィンドウから「db2 get snapshot for locks on データベース名」とするとロックの一覧を参照できます。どのアプリケーションがどのようなロックを取得しているかがわかります。また、更新ロックを保持している間に他のコネクションから該当行(テーブルロックの場合は該当テーブル)に対して更新を行えないことで確認できます。この際にロックタイムアウトまでの待ち時間を無限に設定していると、いつまでたってもロック獲得待ちのままになります。
(2)
コミットまたはロールバックでロックは解除されます。このことはすべてのロックに関していえます。
(3)
特別な方法はありません。更新ロックを獲得した後は同一コネクションからであれば排他ロックを獲得できます(更新できます)。

よく覚えていませんが、更新ロックに関してもロック保持期間が分離レベルで異なっていたような気がします。特に指定しなければ分離レベルはCS(ReadCommited)ですので、(コミットやロールバックを行わなくても)カーソルが離れた瞬間にロックが開放された気がします。

(1)
db2のコマンドウィンドウから「db2 get snapshot for locks on データベース名」とするとロックの一覧を参照できます。どのアプリケーションがどのようなロックを取得しているかがわかります。また、更新ロックを保持している間に他のコネクションから該当行(テーブルロックの場合は該当テーブル)に対して更新を行えないことで確認できます。この際にロックタイムアウトまでの待ち時間を無限に設定していると、いつまでたってもロック獲得待ちのままになります。
(2)
コミットまたはロールバックでロック...続きを読む

QDB2のTimestamp型

DB2のTimestamp型のカラムに
'Current-Timestamp'以外で
設定可能なデフォルト値というのは
あるのでしょうか?

Aベストアンサー

以下のURLが参考になると思います。

参考URL:http://www-06.ibm.com/jp/software/data/developer/library/techdoc/daytime.html


人気Q&Aランキング