OracleDatabase

【ORACLE】テーブル容量の確認


テーブルの容量はDBA_SEGMENTS.BYTESに格納されているので、
SEGMENT_NAMEにテーブル名を与えればゲットすることが出来る
 
 SELECT SEGMENT_NAME,BYTES
 FROM DBA_SEGMENTS
 WHERE SEGMENT_NAME = :TAB_NAME
 
BYTESは単位が本当に「バイト」なので、
キロバイトにするなら÷1024
メガバイトにするなら÷(1024^2)
ギガバイトにするなら÷(1024^3)
をする必要がある。
取得してきた後にEXCELとか電卓とかで計算してもいいけど
面倒な場合は取得するときに割ればよい。
 

 SELECT SEGMENT_NAME  
    ,BYTES  
    ,BYTES/1024 K_BYTES  
    ,BYTES/1024/1024 M_BYTES  
    ,BYTES/1024/1024/1024 G_BYTES  
 FROM DBA_SEGMENTS  
 WHERE SEGMENT_NAME = :TAB_NAME  
 

 
なお、パーティション表の場合は、
SEGMENT_NAMEがテーブル名
PARTITION_NAMEがパーティション名になり、
単にSEGMENT_NAMEだけ与えただけではパーティションの数だけ結果が返ってくる。
SELECT項目にPARTITION_NAMEを加えた方が良い。
 
続きがあります
 


【ORACLE】セッションの強制KILL

セッションを切断するには下記のSQLを発行する。 sysdbaじゃなくてもOK。 ALTER SYSTEM KILL SESSION '[SID],[SERIAL#]'; たとえばSID=100、SERIAL#が12345な

ORACLEの面倒な仕様(分散トランザクション)


1つのトランザクション内で

DBリンク経由等から異なるインスタンスのデータを"参照"(SELECT)した場合、

そのトランザクションは「分散トランザクション」になる。

通常のJDBCからの接続(OracleDataSourceとか)でもそうなる。

ただOracleXADataSourceからConnectionつくると

「別インスタンスの」という条件を満たさなくても分散トランザクションになる。


【ORACLE】長時間流れているSQLの処理状況を調査


※経験則に基づくものであり、ORACLEの仕様を把握して書いてるわけではないです

投げたSQL(SELECT文とか)が全然かえってこないという場合

下記2つの見方でそのSQLの進行状況がある程度把握できる

(1)V$SESSION.SEQ#が変化するか

 UPDATEやDELETEなどを実行したのにいつまでたっても終わらない場合、

 先に該当レコードや表が掴まれている(LOCKされている)可能性がある。

 その場合、「待たされてるほう」のセッションは先行セッションのLOCK解放待ちになり、

 その間V$SESSION.SEQ#が同じ値のまま動かなくなる。

 逆に言うと、V$SESSION.SEQ#が見るたび変化してるようなら、

 そのセッションはちゃんと動いている。(少なくともLOCK解放待ちではない)

 この数値の変動具合が大きいほど進み具合が大きいような気がするが、

 詳しい仕様はよくしらない。

 また、特殊なケースではこの数値が変化していても

 実際は全然進んでいない というようなこともある。

 ⇒元表に項目追加したことによる関連マテビューのリフレッシュ等で

  この現象を目にしたことがある。

  SEQ#が動いてるので放置してたら

  6時間以上経っても終わらなかった(普段2時間くらい)ので強制KILLした

 あと、この数値は65535あたりを境に0に戻ってループし始める。

 このあたりは実体験に基づくものであり、正確な仕様はわからない。