Oracle 豆辞典


注意 : これは、私個人の覚え書きであり、何も保証するもではありません。自己責任でお読み下さい。



読取専用のユーザ権限

読み取り専用のユーザには下記の権限を与えます。

  1. CREATE SESSION 権限(接続のため)
  2. SELECT ANY TABLE 権限(全てのテーブル参照するため)



デフォルトで作成されているユーザ

[USERS][PASSWORD]を表す。

[INTERNAL][ORACLE]
INTERNAL は、データベースの起動および停止を含むデータベース管理タスクの実行に使用される。
注意: INTERNAL は、正確にはユーザ名ではなく、SYS ユーザ名(下記参照)とSYSDBA 権限の別名。
注意: このパスワードは、Oracle8i データベースをインストールしていないユーザにのみ必要。
Oracle8i データベースをインストールしたユーザは、ORA_DBA と呼ばれる特別のWindows NT ローカル・グループにユーザ名が追加されているため、INTERNAL として接続する際はパスワードの入力を要求されない。

[SYS][CHANGE_ON_INSTALL]
SYS は、データベース管理タスクの実行に使用される。SYS には次のデータベース・ロールが含まれている。
AQ_ADMINISTRATOR_ROLE、AQ_USER_ROLE、CONNECT、CTXAPP、DBA、DELETE_CATALOG_ROLE、EXECUTE_CATALOG_ROLE、EXP_FULL_DATABASE、HS_ADMIN_ROLE、IMP_FULL_DATABASE、JAVA_ADMIN、JAVADEBUGPRIV、JAVAIDPRIV、JAVAUSERPRIV、OEM_MONITOR、RECOVERY_CATALOG_OWNER、RESOURCE、SELECT_CATALOG_ROLE、SNMPAGENT、TIMESERIES_DBA、TIMESERIES_DEVELOPER

[SYSTEM][MANAGER]
データベース管理タスクの実行に使用される。AQ_ADMINISTRATOR_ROLE およびDBA データベース・ロールが含まれている。

[OUTLN][OUTLN]
CONNECT およびRESOURCE データベース・ロールが含まれる。プラン・スタビリティをサポートしてる。プラン・スタビリティにより、同一のSQL 文に対して同じ実行プランを維持できる。OUTLN は、格納されたアウトラインに関連するメタデータを集中的に管理する場所として機能する。

[DBSNMP][DBSNMP]
Oracle Instelligent Agent を使用する場合に必要なユーザ。Oracle Enterprise Manager(OEM)より使用される。使用していない時は削除可能。
CONNECT、RESOURCE およびSNMPAGENT の各データベース・ロールが含まれている。このロールおよびユーザを削除する場合は、CATNSNMP.SQL を実行する。

[MTSSYS][MTSSYS]
Oracle Services for Microsoft Transaction Server のユーザ。使用していない時は削除可能。

[SCOTT/DEMO][TIGER]
データベースのデモ用のユーザ。削除可能。
CONNECT およびRESOURCE データベース・ロールが含まれている。

[CTXSYS][CTXSYS]
Oracle interMedia Text のユーザ。使用していない時は削除可能。
CONNECT、DBA およびRESOURCEの各データベース・ロールが含まれている。

[MDSYS][MDSYS]
Oracle Spatial and interMedia Audio、Video、Locator およびImage の管理者ユーザ。使用していない時は削除可能。

[ORDSYS][ORDSYS]
Oracle interMedia Audio、Video、Locator および Image のユーザであり、Oracle Time Series および Oracle Visual Information Retrieval の管理者ユーザ。
Oracle interMedia Audio、Video、Locator および Image を使用していない時は削除可能。
CONNECT、JAVAUSERPRIV およびRESOURCE の各データベース・ロールが含まれている。
* Oracle Time Series および Oracle Visual Information Retrieval は日本においてはサポートされていない。

[ORDPLUGINS][ORDPLUGINS]
Oracle interMedia Audio、Video のユーザ。使用していない時は削除可能。
CONNECT およびRESOURCEロールが含まれている。
1 つのセッションでシステム固有でないプラグイン形式が複数使用できます。

[COMDEMO][COMDEMO]
Oracle COM Automation のユーザ。使用していない時は削除可能。
DBA およびRESOURCE データベース・ロールが含まれている。

[SYSMAN][OEM_TEMP]
Oracle Enterprise Manager のユーザ。使用していない時は削除可能。



オプティマイザにヒントを与えるには

通常、Oracle は統計情報が存在する場合、デフォルトでオプティマイザがコストベース最適化(CBO:コスト・ベース・オプティマイザ)を採用し、スループットを最大にするようにします。
テーブル、インデックスに関する統計情報を基に「コスト(読み込んだデータブロック数)」をはじき出し、コストがもっともかからないアクセスパスで実行する様になっています。
その際、オプティマイザが誤ったインデックスを採用する場合があります。データベース管理者がオプティマイザに対してどのインデックスを使用するかヒントを与えるとパフォーマンスの向上を得る場合があります。
ヒントは SQL(SELECT,DELETE,INSERT,UPDATRE)文中にコメント(/* */,-- --)として記述します。コメントは、SELECT,DELETE,INSERT,UPDATREのいずれかのキーワードの直後に指定した場合のみ有効です。
但し、ヒントを与えても必ずしも使用されるとは限りません。また、インデックス名等を間違えている場合も使用されません。

構文
 {SELECT|DELETE|INSERT|UPDATE} /*+ hint [text] [hint [text]]・・・・ */

例) テーブル名に設定してあるインデックス名1,インデックス名2を使用してみてはどうかと、オプティマイザにヒントを与えています。
 SELECT /*+ INDEX (テーブル名 インデックス名1,インデックス名2) An INDEX is decided compulsorily. */
 FROM    テーブル名
 WHERE  条件文

 ※An INDEX is decided compulsorily. と記述はコメントとして扱われています。後から SQL文を見たときにわかりやすいように私が入れました。

私はメーカーSEが「メモリを増設するしか手がないが、Oracleが使用できるメモリの上限値(32bit OSの場合、SGAが約1.7GBまで)なので、手の打ちようがない。」と言われていたシステムのレスポンス、ディスクIOの負荷を、この方法で20%程度になるまで削減できました。

実際にどのインデックスがどのように使用されているかは、Oracle の 「EXPLAIN PLAN (実行計画)」を見て判断するしかありません。「EXPLAIN PLAN (実行計画)」の使い方は Oracle のマニュアルを参照して下さい。私は、SQL文を組めないので、株式会社システムインテグレータ の「SI Object Browser」と言うツールを使用しました。このツールは非常に使い勝手がよく、SQLをろくに知らない私でも Oracle を見た目で管理させてくれます。

2003年5月26日 追記

インデックス使用時の注意

  1. TABLE_NAMEは必須です。
  2. 表名にエイリアス(別名)が使用されている場合は、エイリアスの方を指定する必要があります。
  3. 表名もしくはそのエイリアスにスペル・ミスがあると、ヒントは無視されます。
  4. INDEX_NAMEは必須では有りません。(INDEX_NAMEを指定しないと、全ての索引が指定されたのと同じとみなされます)
  5. INDEX_NAMEは指定されているがTABLE_NAMEが指定されていない場合、ヒントは無視されます。
  6. TABLE_NAMEが正しく指定されているが、INDEX_NAMEの指定が間違っている場合、ヒントは無視されます。
  7. INDEX_NAMEが複数指定されている場合、オプティマイザが統計に基づき、最もコストが低い索引を選択します。もしくは、複数の索引にアクセスし、その結果をマージするようなアクセス・パスが選択されます。

2004年1月7日 追記

WHERE文に含まれていないヒントを与えると、オプティマイザが使用してしまいます。




統計情報の取り方

コストベース最適化を行うためには、テーブル、インデックスの統計情報が必要になります。統計情報を取るには2つの方法があります。

1.Analyze コマンド

2.DBMS_STATS コマンドの GATHER_SCHEMA_STATS プロシージャ(これは Oracle8i からの機能です。)

テーブル、インデックスが非常に多い場合に有効的な手段です。これはスキーマ内の全てのオブジェクトに関する統計情報を収集します。

構文
 DBMS_STATS.GATHER_SCHEMA_STATS('ownname',estimate_percent,CASCADE => statab)

例)SCOTT と言うスキーマを10%のサンプルで統計情報を採取し、GATHER と言うユーザ統計表の識別子に保存する場合
 DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT',10,CASCADE => 'GATHER')

私は2の方法でバッチファイルを作成し、Windows のタスク・スケジューラで、毎日、深夜に実行しています。

バッチ・ファイルのサンプル

ECHO EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS^('SCOTT',20,CASCADE =^> GATHER^) > gather_schema.sql
ECHO EXIT >> gather_schema.sql
sqlplus ユーザ名/パスワード@ホスト文字列 @gather_schema.sql

※ ^ は特殊文字のエスケープです。

統計情報を取るときの注意

※ REBUILD と COALESCE は同時に指定することは出来ません。

※ RBO をサポートするのは Oracle9i Database Release2 が最後となる予定です。M




エラーメッセージコード”00000”

Oracle でインポート、エクスポート等を行った時に

Invalid format of (ユーティリティ名) utility name
Verify that ORACLE_HOME is properly set
(ユーティリティ名) terminated unsuccessfullyXXX-00000 : Message 0 not found; No message file for product=RDBMS, facility=XXX

のエラーが出る場合があります。

その時には、メッセージファイルが消えている場合があります。
必要なメッセージファイルは、

%ORACLE_HOME%\RDBMS\mesg
(ORACLE_HOME は レジストリの\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE に "ORACLE_HOME"として設定されています。 )

に存在します。このディレクトリに、上記、エラーメッセージの

” facility で指定されている機能面のポインタ”+”ロケール名(ja:日本、us:アメリカ)”+”.msb”

と言うファイルを置けば、エラーはなくなります。

".msb"のファイルが見つからない場合は、lmsgen と言うユーティリティを使用して、テキスト・ベースのメッセージ・ファイル(.msg)をバイナリ形式(.msb)に変換します。詳細はOracleの「NLS ガイド」を参照して下さい。




「ほかのユーザーが同じデータに対して・・・」のメッセージ

Access 2000 から Oracle 8(8.0.5) のデータを削除する時に

上記メッセージはODBCドライバのバージョンによって発生します。

私の環境 (WinNT 4.0 SP6 + Access 2000 SP3) では、ODBCドライバが8.0.5.1b、8.0.5.5 については問題がありませんでしたが、8.0.5.8、8.0.5.9、8.0.5.10では上記メッセージが発生しました。
原因はよく分かりませんが、このメッセージが発生したデータを確認すると、2バイト文字(No.、(株)など)が入っているデータがばかりでした。なので、ODBCドライバのUNICODEへの対応の不具合だと思われます。

パッチを当てようとして、リリースノートを読むと、

となっています。パッチはOracle社より有償サポートを受けているユーザ向けにPatch Set Release としてWindows NT for Intel (8.0.5.2.6) を提供されています。なので、パッチを当てての確認はしておりません。

なお、Microsoft Office 2000 で利用可能な Oracle ODBC Driver の Version は 8.0.5.5 以降です。「Oracle8 Server R8.0.5」には、8.0.5.1b が入っていますので、8.0.5.5 を使用すれば、回避できます。

8.0.5.5 は「ORACLE Technology NETWORK (OTN) (要ユーザ登録)」からダウンロードできます。




Version の取得

SELECT BANNER FROM V$VERSION
ORDER BY BANNER
;




初期化パラメータの取得

SELECT NUM, NAME,
       VALUE,
       ISSYS_MODIFIABLE,
       TYPE
FROM   V$PARAMETER
;




SGA領域取得

Fixed、共有プール、DBバッファ、REDOバッファ

SELECT NAME,
       VALUE
FROM   V$SGA
;

総SGAサイズがメモリの1/2になるようにする。




登録されているユーザを表示する

COLUMN USERNAME             HEADING "USER_NAME"      FORMAT a15
COLUMN DEFAULT_TABLESPACE   HEADING "DEFAULT"        FORMAT a15
COLUMN TEMPORARY_TABLESPACE HEADING "TEMPORARY"      FORMAT a10
COLUMN PROFILE              HEADING "PROFILE"        FORMAT a10
COLUMN ACCOUNT_STATUS       HEADING "ACCOUNT_STATUS" FORMAT a15
SELECT USERNAME,
       DEFAULT_TABLESPACE,
       TEMPORARY_TABLESPACE,
       PROFILE,
       CREATED,
       ACCOUNT_STATUS
FROM   DBA_USERS
;




テーブルスペースの総容量、使用容量、空き容量取得

SELECT T.TABLESPACE_NAME,
       TRUNC(T.BYTES/(1024*1024),0)                    TOTAL_M,
       ROUND((T.BYTES - SUM(F.BYTES)) / (1024*1024),0) USED_M,
       ROUND(SUM(F.BYTES) / (1024*1024),0)             FREE_M,
       ROUND((1-SUM(F.BYTES) / T.BYTES)*100,2)         RATE
FROM   SYS.DBA_FREE_SPACE         F,
      (SELECT TABLESPACE_NAME,
              SUM(BYTES)          BYTES
       FROM   SYS.DBA_DATA_FILES
       GROUP BY TABLESPACE_NAME)  T
WHERE  T.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
GROUP  BY T.TABLESPACE_NAME,
          T.BYTES
;




テーブルスペースの状況確認

COLUMN TABLESPACE_NAME HEADING "TABLE_SPACE" FORMAT a15
SELECT TABLESPACE_NAME,
       INITIAL_EXTENT,
       NEXT_EXTENT,
       MIN_EXTENTS,
       MAX_EXTENTS,
       PCT_INCREASE,
       MIN_EXTLEN,
       STATUS,
       EXTENT_MANAGEMENT,
       ALLOCATION_TYPE
FROM   DBA_TABLESPACES
;




テーブルスペースに格納されているオブジェクト取得

COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
COLUMN OWNER        HEADING "OWNER"        FORMAT a10
COLUMN SEGMENT_TYPE HEADING "SEGMENT_TYPE" FORMAT a12
COLUMN AREA_M       HEADING "AREA_SIZE(M)" FORMAT 999,990
SELECT SEGMENT_NAME,
       OWNER,
       SEGMENT_TYPE,
       TRUNC(BYTES/(1024*1024),0) AREA_M
FROM   DBA_SEGMENTS
WHERE  TABLESPACE_NAME = 'テーブルスペース名'
ORDER  BY SEGMENT_TYPE,
          SEGMENT_NAME
;




テーブルスペース内の空き領域

SELECT B.FILE_NAME,
       A.BYTES
FROM   DBA_FREE_SPACE A,
       DBA_DATA_FILES B
WHERE  A.TABLESPACE_NAME = 'テーブルスペース名'
AND    A.FILE_ID = B.FILE_ID
;




テーブルスペース内の空き領域を結合する

ALTER TABLESPACE テーブルスペース名 COALESCE
;

※ COALESCE と REBUILD は同時に指定することは出来ません。




ライブラリキャッシュ 要求数、再読込数、ヒット率

SELECT SUM(PINS)    "Executions",
       SUM(RELOADS) "Misses",
       ROUND(100*(1-(SUM(RELOADS) / SUM(PINS))),3) "Hit Rate"
FROM   V$LIBRARYCACHE
;

ヒット率が99%未満の場合、shared_pool_size を拡大する。




データ・ディクショナリ・キャッシュ 要求数、再読込数

SELECT SUM(GETS)      "Gets",
       SUM(GETMISSES) "Misses",
       ROUND(100*(1-(SUM(GETMISSES) / SUM(GETS))),3) "Hit Rate"
FROM   V$ROWCACHE
WHERE  GETS <> 0
;

ヒット率が90%未満の場合、shared_pool_size を拡大する。




データベース・バッファ・ヒット率

SELECT (A.VALUE + B.VALUE) "Logical Read",
        C.VALUE            "Physical Read",
        ROUND(((1-(C.VALUE / (A.VALUE + B.VALUE)))*100),3) "Buffer Hit Rate"
FROM    V$SYSSTAT A,
        V$SYSSTAT B,
        V$SYSSTAT C
WHERE   A.NAME = 'db block GETS'
AND     B.NAME = 'consistent GETS'
AND     C.NAME = 'physical reads'
;

ヒット率が90%未満の場合、db_block_buffers を拡大する。

注)Oracle9から db_block_buffer は使用されなくなり、動的パラメータとして db_cache_size になりました。




共有プール内の空き領域の大きさ取得

SELECT S.NAME,
       S.BYTES                          "Free Bytes",
       ROUND((S.BYTES / P.VALUE)*100,3) "Free %",
       P.VALUE / (1024*1024)            "Shared Poll MB"
FROM   V$PARAMETER P,
       V$SGASTAT   S
WHERE  S.NAME = 'free memory'
AND    P.NAME = 'shared_pool_size'
;

メモリが無駄に割り当てられていないか、空き領域が30%を超える場合、shared_pool_size を小さくしてもよい。




メモリ・ソート率

SELECT A.VALUE MEM_SORT,
       B.VALUE DISK_SORT,
       A.VALUE * 100 / (A.VALUE+B.VALUE) MEM_SORT_RATE
FROM   V$SYSSTAT A,
       V$SYSSTAT B
WHERE  A.NAME = 'sorts (memory)'
and    B.NAME = 'sorts (disk)'
;




REDOバッファ 空き待機回数

SELECT VALUE
FROM   V$SYSSTAT
WHERE  NAME = 'redo log space requests'
;

回数が多い、定期的に増える場合、log_buffer を拡大する。




ロールバック・セグメント ヒット率

SELECT R.NAME    NAME,
       S.GETS    GETS,
       S.WAITS   WAITS,
      (S.GETS - S.WAITS) * 100 / GETS HIT_RATE,
       S.SHRINKS SHR,
       S.EXTENDS EXDS,
       S.EXTENTS EXTS,
       S.HWMSIZE HWM
FROM   V$ROLLSTAT S,
       V$ROLLNAME R
WHERE  S.USN = R.USN
;




ロールバック・セグメント を増やす目安

SELECT * FROM V$WAITSTAT WHERE CLASS = 'undo header'
;

インスタンス起動時からの SQL 文発行時までのロールバック・セグメントの競合を調べる事が出来る。
実行結果、COUNT、TIME 共に 0 より大きく、特に TIME の値が大きい場合には競合が発生している。
ロールバック・セグメントを増やす事を検討する。




トランザクション数の確認

COMMIT された回数の差分とロールバックされた回数の差分を取る事で採取する。

COMMIT(暗黙も含む)された回数
SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'user commits'
;

ロールバックされた回数
SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'user rollbacks'
;

この2つの SQL 文を時間を置いて実行し、その差分がトランザクションの発生回数となる。




現時点のトランザクション数の確認

SELECT SUM(XACTS) FROM V$ROLLSTAT
;




ディスク・アクセスの多い SQL 調査

SET    RECSEP      EACH
COLUMN SQLTYPE         HEADING "Type"           FORMAT a4
COLUMN LONG_TEXT       HEADING "SQL Text"       FORMAT a40
COLUMN FIRST_LOAD_TIME HEADING "FirstLoad Time" FORMAT a19
COLUMN EXECUTIONS      HEADING "Exe |cute"      FORMAT 999,999
COLUMN DISK_READS      HEADING "Disk Read"      FORMAT 99,999,990
COLUMN BUFFER_GETS     HEADING "Buffer|Get"     FORMAT 9,999,990
SELECT DECODE(COMMAND_TYPE, 2,'INS',
                            3,'SEL',
                            6,'UPD',
                            7,'DEL','?')  SQLTYPE,
     SUBSTR(SQL_TEXT,1,1024) LONG_TEXT,
     FIRST_LOAD_TIME,
     EXECUTIONS,
     DISK_READS,
     BUFFER_GETS
FROM  V$SQLAREA
WHERE DISK_READS >
     (SELECT AVG(DISK_READS)
      FROM
     (SELECT DISK_READS
      FROM   V$SQLAREA
      WHERE  DISK_READS >
     (SELECT AVG(DISK_READS)
      FROM   V$SQLAREA)
     )
     )
ORDER BY DISK_READS DESC,
         BUFFER_GETS
;




統計情報を採取した日を表示する SQL 調査

 




ODBC Driver の Version

Windows 2000 Windows XP Windows Server 2003
8.1.6.1.0
8.1.7.X
9.0.1.X
9.2.0.X
8.1.7.6.0
9.0.1.X
9.2.0.X
9.2.0.3.0 以上

Microsoft .NET
8.1.7.7.0
9.0.1.4.0
9.2.0.1.0

Office 2000 Office XP
8.0.5.5 8.0.6.6.0
8.1.6.6.0
8.1.7.5.0
9.0.1.2.0

ODBC Driver Version

接続先DB Version

7.3.4 8.0.6 8.1.7 9.0.1 9.2.0
ODBC R8.0.6 ×
ODBC R8.1.7
ODBC R9.0.1 ×
ODBC R9.2.0 ×



Oracle Fail Safe(OFS)で共有ディスクに配置する必要があるファイル

下記の SQL にて表示されるファイルが該当するものです。

SELECT NAME              FROM V$CONTROLFILE
UNION SELECT NAME        FROM V$DATAFILE
UNION SELECT MEMBER      FROM V$LOGFILE
UNION SELECT DESTINATION FROM V$ARCHIVE_DEST  (最後の1行はArchivelog Modeの場合のみ)
;




Oracle Fail Safe(OFS) のフェイルバック

優先ノードとして設定されたノードが障害状態から復旧した場合に、該当のグループを非優先ノードから優先ノードに移動する動作の事。
OFS は、フェイルバックなどの動作に関して、Microsoft Cluster Server(MSCS) の機能を使用している。

フェイルバックは「優先ノードが障害状態から復旧した際に、優先ノードに戻る」動作の事を指す。これに当てはまらない場合は、フェイルバックは行われない。
手動でフェイルオーバーさせた場合や、Oracleの障害によってフェイルオーバーした場合は、ノードが異常な状態の為にフェイルオーバーしたわけではないので、そこからから復旧するという事もないので、フェイルバックは行われない。あくまで、ノードの異常によるフェイルオーバーした時のみに限られる。




Oracle Fail Safe(OFS) のVersion

Windows 2000 環境

OFSのVersion OracleのVersion
3.3.2 8.1.7 , 9.0.1 , 9.2.0(PSR 9.2.0.2以上)
3.2.1 8.1.7 , 9.0.1
3.1.2 , 3.1.1 8.1.6 , 8.1.7
3.0.4 8.1.6

Windows Server 2003 環境では OFS 3.3.2以降




DATAFILE を縮小する場合の最小値

RESIZEによってファイルサイズを縮小する場合は最後尾のFREE BLOCK分のみ縮小することが可能。
DATAFILE内に不連続なFREE BLOCKが存在している場合は、現在使用中のエクステントのサイズの合計までしか縮小することはできない。

1. データファイルのサイズ、ファイル ID を確認する。

SELECT FILE#,
       BYTES,
       NAME
FROM   V$DATAFILE
WHERE  NAME LIKE '%test%'
;

FILE#      BYTES           NAME
---------- ---------- ------------------------------
        19      10485760 /tmp/test.dbf

2. FREE SPACE を確認する。

SELECT * FROM DBA_FREE_SPACE
WHERE  TABLESPACE_NAME = 'TEST'
ORDER BY BLOCK_ID
;

TABLESPACE_NAME  FILE_ID BLOCK_ID BYTES    BLOCKS RELATIVE_FNO
---------------- ------- -------- -------- ------ ------------
TEST                  19        2    81920     10           19
TEST                  19       22    81920     10           19
TEST                  19       42 10149888   1239           19
                               **

<FREE SPACE の最後の開始位置(**)> -1> * DB_BLOCK_SIZE までの大きさとなる。
例の場合、(42-1) * 8 K = 328 K になる。(DB_BLOCK_SIZE を 8K とした場合。)

3. RESIZE する。

ALTER DATABASE DATAFILE '/tmp/test.dbf' RESIZE 328 K;

※ RESIZE が DB_BLOCK_SIZE の倍数出ない場合は、値で RESIZE される。




テーブル、インデックスを異なる表領域への移動

テーブルを異なる表領域に移動する。

ALTER TABLE テーブルスペース名 MOVE TABLESPACE 表領域
;

この場合、インデックス再作成が必要となります。インデックスの再作成の方法は「統計情報の取り方」を参照。

インデックスを異なる表領域に移動するには、インデックスの再作成時にテーブルスペース名をすれば可能。




次回EXTENT時に、エラーになるTABLEの検出方法

SELECT TABLESPACE_NAME TABLESPACE,
       TABLE_NAME      TABLE_NAME,
       NEXT_EXTENT     NEXT
FROM   USER_TABLES     OUTER
WHERE  NOT EXISTS
      (SELECT 'X' FROM SYS.DBA_FREE_SPACE INNER
       WHERE OUTER.TABLESPACE_NAME = INNER.TABLESPACE_NAME
       AND BYTES >= NEXT_EXTENT)
;



テーブル、インデックス領域のエクステント回数を調べる

COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
SELECT SEGMENT_NAME,
       SEGMENT_TYPE,
       COUNT(*)
FROM   USER_EXTENTS
GROUP BY SEGMENT_TYPE,
         SEGMENT_NAME
;

または、

COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
SELECT SEGMENT_NAME,
       SEGMENT_TYPE,
       EXTENTS
FROM   USER_SEGMENTS
WHERE  SEGMENT_TYPE IN ('TABLE','INDEX')
ORDER BY SEGMENT_TYPE,
         SEGMENT_NAME
;

 

エクステントの詳細を調べるには

COLUMN SEGMENT_NAME    HEADING "SEGMENT_NAME"    FORMAT a30
COLUMN SEGMENT_TYPE    HEADING "SEGMENT_TYPE"    FORMAT a12
COLUMN TABLESPACE_NAME HEADING "TABLESPACE_NAME" FORMAT a15
COLUMN BYTES           HEADING "BYTES(M)"        FORMAT 999,990
SELECT SEGMENT_NAME,
       SEGMENT_TYPE,
       TABLESPACE_NAME,
       EXTENT_ID,
       BYTES /1024/1024 BYTES,
       BLOCKS
FROM   USER_EXTENTS
ORDER BY TABLESPACE_NAME,
         SEGMENT_TYPE,
         SEGMENT_NAME,
         EXTENT_ID
;



オブジェクト領域の実際の使用領域を調べる

COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
COLUMN OWNER        HEADING "OWNER"        FORMAT a10
COLUMN SEGMENT_TYPE HEADING "TYPE"         FORMAT a5
COLUMN AREA_M       HEADING "AREA_SIZE(K)" FORMAT 999,999,990
COLUMN USED_M       HEADING "USED_SIZE(K)" FORMAT 999,999,990
SELECT DBAS.SEGMENT_NAME,
       DBAS.OWNER,
       DBAS.SEGMENT_TYPE,
       TRUNC(DBAS.BYTES/1024,0) AREA_M,
       TRUNC(DBAT.BLOCKS*PARA.VALUE/1024,0) USED_M
FROM   DBA_SEGMENTS DBAS,
       DBA_TABLES   DBAT,
       V$PARAMETER  PARA
WHERE  DBAS.TABLESPACE_NAME = 'テーブルスペース名'
AND    DBAS.SEGMENT_NAME    =  DBAT.TABLE_NAME
AND    PARA.NAME            = 'db_block_size'
ORDER  BY DBAS.SEGMENT_NAME,
DBAS.SEGMENT_TYPE
;



テーブル、インデックスの状況確認

COLUMN SEGMENT_NAME    HEADING "SEGMENT_NAME"    FORMAT a30
COLUMN SEGMENT_TYPE    HEADING "SEGMENT_TYPE"    FORMAT a12
COLUMN TABLESPACE_NAME HEADING "TABLESPACE_NAME" FORMAT a15
COLUMN BYTES           HEADING "BYTES(M)"        FORMAT 999,990
COLUMN BLOCKS          HEADING "BLOCKS"          FORMAT 999,990
COLUMN EXTENTS         HEADING "EXTENTS"         FORMAT 999,990
COLUMN INITIAL_EXTENT  HEADING "INITIAL(M)"      FORMAT 999,990
COLUMN NEXT_EXTENT     HEADING "NEXT(M)"         FORMAT 999,990
COLUMN MAX_EXTENTS     HEADING "MAX_EXTENTS"     FORMAT 999,999,999,990
SELECT SEGMENT_NAME,
       SEGMENT_TYPE,
       TABLESPACE_NAME,
       BYTES /1024/1024          BYTES,
       BLOCKS,
       EXTENTS,
       INITIAL_EXTENT /1024/1024 INITIAL_EXTENT,
       NEXT_EXTENT /1024/1024    NEXT_EXTENT,
       MIN_EXTENTS,
       MAX_EXTENTS               MAX_EXTENTS,
       PCT_INCREASE
FROM   USER_SEGMENTS
WHERE  SEGMENT_TYPE IN ('TABLE','INDEX')
ORDER BY SEGMENT_TYPE,
         SEGMENT_NAME
;

ローカル管理表の場合、NEXT_EXTENT値は表示されません。



”〜”の文字化け(Windows環境)

これは、Oracle9.0.1.4.0以上、Oracle9.2以上とWindowsとで、SJISとUnicode間の変換を行う時の、Unicodeの対応が異なる為に発生します。Windows上のUnicodeに対応するように、Oracleには”JA16SJISTILDE”、”JA16EUCTILDE”があります。
oo4o(Oracle Objects for OLE)の場合、INSERTの場合は問題が発生しませんが、SELECTなどの時には問題が発生します。

クライアント側ではレジストリキー名 HKEY_LOCAL_MACHIN\SOFTWARE\ORACLE\HOMEx、値の名前 NLS_LANG の値を”JAPANESE_JAPAN.JA16SJISTILDE”などにすると解消されます。
その他のミドルウエアでは、クライアントを修正すると共に、データベースのCHARACTER SETを”JA16SJISTILDE”、”JA16EUCTILDE”にする必要があります。
データベース作成後にCHARACTER SETを変更するには、変換後のキャラクタ・セットがスーパーセットでなくてはなりませんが、CHARACTER SETを”JA16SJISTILDE”、”JA16EUCTILDE”はスーパーセットではないため、データベースの作成し直しが発生します。スーパーセットについてはマニュアルを参照してください。
結果として、Windows環境の場合、CHARACTER SETを”JA16SJISTILDE”、NLS_LANGはサーバもクライアントも”JAPANESE_JAPAN.JA16SJISTILDE”にしないと文字化けは防げないようです。
また、データベースのキャラクタ・セットとクライアントのキャラクタ・セットが同一の場合、文字コード変換は行われません。

CHARACTER SETの移行方法

  1. CHARACTER SETがJA16SJIS環境にてExportする。
  2. CHARACTER SETがJA16SJISTILDEのデータベースを作成する。
  3. 1.で作成したExportファイルをNLS_LANGをJA16SJISとしてImportする。
  4. Import完了後、NLS_LANGをJA16SJISTILDEとする。

NLS_LANGはWindowsの環境変数でも設定可能。
 コマンドプロンプトから
  set NLS_LANG=JAPANESE_JAPAN.JA16SJISTILDE
 と入力する。

CHARACTER SET Oracle内部に格納する時に使用される文字コード体系。WindowsではJA16SJISかJA16SJISTILDEとなる。(OSに合わせる)
NLS_LANG データベースから取り出した文字データをどのような文字コードで変換するかを設定する。

データベースのキャラクタ・セットを確認するには、

 



最大同時接続数

最大同時接続数は、V$LICENSE ビュー の SESSIONS_HIGHWATER 列 にて確認することができます。

SELECT sessions_highwater FROM v$license;

この列にて確認できるのは、インスタンス起動時から現時点までの期間における最大同時接続数です。
前回起動時以前のデータについても確認する場合は、データベースshutdown時にalertログに記録されている"License high water mark" の値がその起動〜停止の期間に発生した最大同時接続数となります。




ORA-3113が発生

MTS接続でアクセスを行なう際にクライアント側にORA-3113が発生する場合があります。
その際、初期化パラメータbackground_dump_dest配下にディスパッチャのトレースが以下のように出力されます。

【ディスパッチャのトレース】
*** 2004-07-15 15:30:07.000
error 18 creating virtual circuit

SESSIONSに設定された数よりも多くバーチャル・サーキットが作成されたことが原因です。
バーチャル・サーキットはMTSで接続された場合にカウントされる。また、別のデータベースに対してMTS接続でDBLINK経由のアクセスを行なうとセッション数が増加せずにバーチャル・サーキット数だけが増加します。
セッション数よりもバーチャル・サーキット数が先にSESSIONSよりも大きくなる場合に発生する。

バーチャル・サーキットは、マルチスレッド・サーバー(MTS)構成時に使用されます。
MTS構成の場合、ユーザーからの処理要求は、ディスパッチャ・プロセスを通して、共有サーバー・プロセスに伝えられ、共有サーバー・プロセスが処理を行い、ディスパッチャ・プロセスに応答を返す。この際に共有プール上に存在するバーチャル・サーキットを通じて、ディスパッチャ・プロセスと共有サーバー・プロセスの処理要求のやり取りが行われます。バーチャル・サーキットは、基本的にデータベースへの接続の時に作成され、切断時に解放されます。

select status , count(*) from v$circuit group by status;

STATUS COUNT(*)
---------------- ----------
NORMAL                  98 <-- データベースへの接続分
OUTBOUND                 0 <-- DBLINKを利用したMTS接続でのアクセス分


初期化パラメータSESSIONSの値を大きく設定して回避します。





注意 : これは、私個人の覚え書きであり、何も保証するもではありません。自己責任でお読み下さい。
Create:2003/02/25   Last modified:2009/10/02
Copyright (c) 2003-2013 Yoshi All Rights Reserved