RDS for Oracleのブロックサイズを調べてみた

2022.07.15

しばたです。

同僚より質問がありRDS for Oracleのブロックサイズについて何点か調べてみたのでブログで共有したいと思います。

DB_BLOCK_SIZE パラメーター

Oracle Databaseでは各データベースファイルは「データブロック」単位で区切られ管理されます。
このブロックサイズは物理読み込みの単位となりIO性能や最大ファイルサイズに影響を及ぼします。 *1

データベース標準のブロックサイズはデータベース構築時にのみ設定可能でDB_BLOCK_SIZEパラメーターに指定します。
私の知る限りのバージョンでDB_BLOCK_SIZEはデフォルト値が8KB (8192) *2で、一度データベースを作成した後は変更できません。

非標準ブロックサイズ

Oracle 9iからDB_BLOCK_SIZEで設定する標準ブロックサイズの他に表領域単位に個別のブロックサイズを設定できます。
この非標準のブロックサイズを使用する場合は予め各ブロックサイズに応じたキャッシュパラメーター

  • DB_2K_CACHE_SIZE
  • DB_4K_CACHE_SIZE
  • DB_8K_CACHE_SIZE
  • DB_16K_CACHE_SIZE
  • DB_32K_CACHE_SIZE

の設定が必要となります。

RDS for Oracleにおけるブロックサイズ

ここまでを踏まえてRDS for Oracleの設定がどうなっているか確認していきます。

検証環境

今回は私の検証AWSアカウントの東京リージョンにOracle 19c SE2の環境を作り調査します。
エンジンバージョンは本日時点で最新の19.0.0.0.ru-2022-01.rur-2022-01.r1とし、その他必要なリソースは事前に準備済みです。

あとクライアントには使い慣れているA5:SQL Mk-2を選んでいます。

RDS for Oracle の DB_BLOCK_SIZE

RDSインスタンスの作成前に新規にパラメータグループを用意してDB_BLOCK_SIZEの内容を確認すると下図の通りでした。

パラメーターグループ上では 値は未定義なうえに編集不可 です。

ドキュメントでもDB_BLOCK_SIZEの値を明記しているものを見つけることができず、実際にRDSインスタンスを作ってみないとダメな様です。

RDS for Oracle のブロックサイズ

続けてRDSインスタンスを作成、接続してインスタンスに対してV$PARAMETERの値を確認してみました。

-- V$PARAMETER からパラメーター値を取得
SELECT NAME, VALUE, ISDEFAULT
  FROM V$PARAMETER
 WHERE NAME = 'db_block_size'

結果は下図の通り、DB_BLOCK_SIZE = 8KでOracle Databaseのデフォルト設定をそのまま使用してました。

RDS for Oracleのエディションやバージョン、インスタンスタイプによってAWSが設定を変えてくる可能性は否定できませんが、ひとまずはDB_BLOCK_SIZE = 8Kと考えて問題ないでしょう。

厳密に正確な結果が必要なる場合は実際のスペックで環境を用意して本記事の様に直接確認してください。

RDS for Oracle で非標準ブロックサイズを試してみる

あと、せっかくなので非標準ブロックサイズを設定できるか試してみました。
今回は事前にDB_16K_CACHE_SIZEを設定しブロックサイズ16KBの表領域を作ってみます。

-- ブロックサイズ 16KB の表領域 MY_16K_TBS を作成
-- ※ 事前に DB_16K_CACHE_SIZE パラメーターを設定してください
CREATE TABLESPACE MY_16K_TBS DATAFILE SIZE 10M AUTOEXTEND ON MAXSIZE 100M BLOCKSIZE 16K

-- 作成後表領域情報を確認
SELECT TABLESPACE_NAME, CONTENTS, BIGFILE, BLOCK_SIZE
  FROM DBA_TABLESPACES

サクッとブロックサイズ16KBの表領域を作れました。
他の表領域が8KBなのも併せて見て取れますね。

非標準ブロックサイズはOracleの標準機能なので利用に際し何も問題無いはずですが、AWSのドキュメントには全然説明が無かったのでサポート状況が気になる方は事前にAWSに問い合わせると良いでしょう。

補足 : RDS for Oracleの最大ファイルサイズ

最後に補足を一点だけ。

ブロックサイズは各データベースファイルの最大サイズに影響を及ぼし、例えばbigfile表領域の場合1ファイルあたり2の32乗ブロックが最大サイズになります。
このため8KBブロックの場合だと最大32TBとなります。

ただしAWSのドキュメントによれば、

The maximum size of a single file on Amazon RDS Oracle DB instances is 16 TiB (tebibytes).

とされており若干少ない値になっています。
こちらについては、確定した根拠は無く予想となりますが、Oracleでなくファイルシステムの制限だと思います。

なお、RDS for Oracle全体のストレージサイズに関しては本日時点で最大64TBです。

最後に

簡単ですが以上となります。

正直なところ最近はOracleに限らずRDBMSのブロックサイズを気にすることがめっきり減ってしまいました。
改めてこういった基本的な仕様を確認するのも大事だなと思った次第です。

脚注

  1. とはいえ2022年現在であればそこまで気にする必要はないかもしれません...
  2. 昔は2Kとかあった...ような...