オラクルの限界性能 Oracle 9i 〜

最近の Linux(32bit 64bitファイル対応)をサーバーとした場合について記述してある。 AIX、Windows、Mac については、プラットフォーム別のマニュアルを参照。

データ型の制限

参照 データ型 および PL/SQL データ型

スキーマオブジェクト

シーケンス

最大値 28 桁 ( 負の場合 10^27 )
備忘欄: 38 桁の typo ではない。 (Oracle 10g 時点)

制約、インデックス

複合キー、インデックスのカラム数は、32カラム以下
但し、ビットマップインデックスは、30カラム以下
おおよそブロックサイズの 80% 程度でエラーとなる。(データブロックサイズにもよる)
今のところ、インデックスでは 行連鎖 の仕組みは採用されていない。

1ブロック同士のメモリ内で比較できないようなキーは通常の業務では考えにくい。しかし、どうしても定常的に比較したい場合でも生データ同士をインデックス化して比較するのは特別な事情がなければ愚行に近い。ハッシュや MD5 関数でハッシュ値を用いて ファンクション索引 で絞り込むのが常套手段である。生データ同士の比較はあくまでも補完である。

プライマリキー

プライマリキー は 32カラム以下 かつ 1 データブロック を超えることはできない。
おおよそブロックサイズの 80% 程度でエラーとなる。

データブロック

データベースのブロック・サイズ

2K/4K/8K/16K/(32K 64bitOS)

最大データブロック数

  • 通常の表領域 1データファイル の最大データブロック数

    2^22(4M)-1 ブロックまで

    ブロックサイズ 4K ... 約 16GB
  • BIGFILE 表領域 1データファイルの最大データブロック数

    2^32(4G)-1 ブロックまで

    ブロックサイズ 4K ... 約 16TB

エクステント

エクステントの大きさ

Oracle 10g 時点

  • ローカル管理表領域(UNIFORM(均一) エクステント指定時)

    2GB×ブロック・サイズ(K またはM 修飾子を使用する場合)
    2GB(K またはM 修飾子を使用しない場合)

MAXEXTENTS

  • デフォルト値

    DB_BLOCK_SIZE 初期化パラメータ

  • 最大値

    無制限

データベース

データベースのキャラクタセットの変更

CREATE DATABSE で作成したデータベースのキャラクタセットは変更することができない。
( ALTER DATABASE CHARACTER SET 構文は無くなった。(実行ができるか未検証) Oracle 10g )
日本語キャラクタセットの場合で望まれているであろう、EUC⇔SJISなどのコード変換を伴う変更は、もともとサポートされていない。 ALTER DATABASE CHARACTER SET で行なうことができた変更は、すべての文字に対して移行先に文字が存在し、同じコードポイント(バイト列)をもつことが必要=スーパーセットである場合に限られていた。
(OK : US7ASCII⇒JA16SJIS、 NG : JA16SJIS ⇔ AL32UTF8(UTF-8)、JA16SJIS ⇔ JA16EUC、etc..)

変換の条件を満たす場合には、
Database Character Set Scanner ユーティリティ群?によって、キャラクタセットを変更することができる。
データベースの文字コードを変更する

  • 関連マニュアル

    Oracle グローバリゼーション・サポート・ガイド 11.キャラクタ・セットの移行

ファイル

制御ファイルのサイズ

ブロックサイズ × 20,000
リカバリカタログを使用しない RMAN に注意

データファイル数

データベースでは、65,533ファイル
1表領域で最大1,022ファイル

参考 初期化パラメータ DB_FILES

データファイル・サイズ

Oracleで利用可能な最大の 1 ファイルサイズ

ファイルOSサイズ
DATAFILEUNIX系 すべて4,194,303 × ブロックサイズ
インポート・エクスポート32bitファイルの場合2GB
64bitファイルの場合無制限(最近は、ほとんどが64bitファイル)
SQL-LOADERファイル32bitファイルの場合2GB
64bitファイルの場合無制限

通常の表領域では(⇔ BIGFILE 表領域)
約 4M(1024*1024)*1 × ブロックサイズ

ブロックサイズ 4K ... 約 16GB
ブロックサイズ 8K ... 約 32GB
ブロックサイズ 16K .. 約 64GB
ブロックサイズ 32K .. 約 128GB (一部のUNIXのみ)

(注意事項) OSの各種コマンドが 2GBの壁が残っているかを再確認(dd / tar / etc )しておく。( Linux )

蛇足: ファイルシステムレベルの制限をWebで調べてみたところ以下のような内容だった。(自信を持って自信なし)

Windows NTFS:2TB/ファイル  (12EB/パーティション) 
        FAT32:4GB/ファイル (32GB/パーティション:Win2000/XP) (2TB/サーバー系?)
Linux kernel2.4系以上 1TB  (EXT2/EXT3仕様は4TB,ファイルシステムで 1TBに制限)
      kernel2.2系     2GB
 XFS:                 9EB
 VxFS                 ?
Solaris(SPARC)
      7 / 8           1TB ?
      2.6(FFS/UFS)    1TB
 VxFS                 2TB以上?

64bit版 Oracle

通常の32bit版の場合、SGAを 約1.7GB*2 までしか使用できない。 それを超える場合には VLM機能を使用する必要がある。
(Window単位に管理されるメモリファイルシステムを経由するため若干性能が低下する)
Linux で 4G以上のメモリを搭載する場合には 64bit環境とそれに対応したオペレーティングシステム、オラクルを検討する。 (Windows は、64bitOS(XP)が出荷されたようですが知りません。)

VLM=Very Large Memory Oracle 9i

SQLにおける制限事項 Oracle 10g

  • SQL ステートメントの最大長 :65535(バイト) 64K バイト Oracle 9i

    ミドルウェアによっては 32K バイトという制限がある可能性もありうる
    DBMS_SQL パッケージを使用すると 64K バイトの壁を越えることが可能。

  • SQL ステートメントの最大長 :記述なし ( 64K 以上であることは確認済み:おそらく制限なし) Oracle 10g
  • システム固有の動的SQL の場合には 32K バイトまで

    引数が VARCHAR2 の制限と思われる。それを超えると

    ORA-06502: PL/SQL: 数値または値のエラー :文字列バッファが小さすぎます。が発生しました

    のエラーが発生する。

  • FROM : 記述なし(おそらく制限なし)
  • WHERE : 記述なし(おそらく制限なし)
  • WHERE 句 での副問い合わせの最大数: 255
  • IN リストに指定できる式の数: 1000

    かなり以前 IN ( val1, val2 ) の値を指定した形式の valn(リテラル) の n が 確か 255 個(確か 256 ではなかったと思う)が上限であった記憶があるが、現在では 1000 個になっている。※副問い合わせの結果セットの件数には制限ない。

  • GROUP BY : GROUP 式、集計関数 は 1データベースブロック以内
    (マニュアルには、こう書いてあるが、その意味を理解できずに不明、それらしい記述をしてみたが分からずじまい)

    数に制限はないとされているが ORA-00962: GROUP BY/ORDER BY句が多すぎます。のエラーには 1000 個以下にするという記述もある。どのバージョンの制限かはわからない。(未検証)

  • ORDER BY : 記述なし

    ORA-00962: GROUP BY/ORDER BY句が多すぎます。のエラーには 1000 個以下にするという記述もある。

  • 標準関数の引数の上限

    組み込み関数の引数の上限はおそらく COALESCE 関数 の 256 であると思われる。しかし、ほとんどの引数が可変長の関数は DECODE 関数の引数の上限 255 個(※) と同じと思われる。
    組み込み関数の引数の上限については特に記述がない。

(※) BIN_TONUM、GREATEST、LEAST、DECODE を調べた結果

  • 集計関数のネスト数: 記述なし(しかし、2ネストまでしか実行できない:グループ関数の方に記述してあると思われる)

注意
記述なし の項目は、それぞれのマニュアル中に散在して記述されていて見つけることができていないだけの可能性があります。
各種制限値はバージョンアップにより撤廃、改良していることが多いのですが、リファレンスマニュアルにキャプションはあっても制限項目すべてが書かれていない状況です。 メジャーバージョンアップ時には、散在している制限項目の記述が削除されて無制限になったのかと思えば制限値は変更されていないなど不備がよくありますので注意してください。

PL/SQLにおける制限事項

  • ユーザー定義関数の引数の上限

    PL/SQL のストアドプロシージャの引数の上限は 65536 。

  • PL/SQL ソースコードのサイズ

    ストアド・プロシージャ、ファンクション、トリガー(※)などの上限
    PCODE が 64KB、一部の Windws では 32KB (Oralce 10g が正式にサポートされる OS ならば無関係だと思われる)。

(※) トリガー の本体を数十行にわたって記述することは推奨されていない。(互換性のためか格納方式も独特) ソースコードが長いと DBMS_METADATA でもエラーになることがある。

  • ストアド・パッケージのサイズ
    PCODE(PARSED_SIZE) が 128KB に近い場合にはパッケージの分割が必要。(OS により 上限サイズが異なる場合もある)
    SELECT * FROM DBA_OBJECT_SIZE
    WHERE NAME = 'オブジェクト名'
 


日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ 会員制(無料)の公式技術サイト

*1 正確には4M-1
*2 確か 1.6GB 〜1.7GB