バージョンアップごとに性能を上げ無償版で勢力を拡大するMicrosoft SQL Serverに対抗すべく鳴り物入りで登場したOracle 10g Database Express Edition(10.2.0.1.0なのでOracle 10g Database R2初版相当か?)。SQL Serverはバージョンアップに追従してMSDE1.0→MSDE2000→Microsoft SQL Server 2005/2008 Express Editionと毎回無償版も投入してきたが、Oracleは既に2世代進んだにも関わらず未だに10g XEのままである。配布は続けているので無償版から撤退するという意思はなさそうではあるが・・・・単体としてしか使えないDBエンジンとしては既にこれ以上手を入れる必要がないという意味なのか、無償版にリソースを裂くつもりあるいは余裕がないかなのか。

 さて、Oracle 10g Database Express Editionが最初に登場して5年の月日が経った。そこで、今更Oracle 10g Database Express Editionの真価を検証してみた(なんかこのブログって旬を外した今更企画が多いな)。
 まず、使用できるサーバーキャラクタセット。配布元には英語版(US7ASCIIキャラセットしかない? あるいは8859-1くらいはあるのか)と、ユニバーサル版(規定のキャラセットはAL32UTF8)があるが、ユニ版は様々なサイトで紹介されているように後でインスタンスを作り直せばかなりのキャラセットが使える。少なくともJA16SJISTILDEは使える。日本語で書かれたサイトだけを見ると手でごにょごにょするような割と面倒な手段しか見つからないが、$ORACLE_HOME/bin/createdb.shを使えば簡単にDBを作り直す事ができる(日本語サイトのいくつかはcreatedb.shの情報もあるにはある)。createdb.shを書き換えればデータファイルの位置なんかも/varの下とかに変更する事ができる(データファイルとログはcreatedb.shのコマンドラインオプションで変更できるけど、flash_recovery_areaは標準では$ORACLE_HOME直下べたうちである)。
 また、createdb.shを実行しただけでは管理画面が使えなくなるXMLDB(規定のポート番号8080)だが、これはXE.shやXE.sqlの中を覗けばなんとかなるはず。しかしここはあえてXMLDBを捨ててしまう選択をあんもちさんはした(どうせ仕事で使う場合はSI Object Browserがあるからね)。同じくcreatedb.shにXMLDBを構築しているSQLがあるが、ここでFTPポートとHTTPポートを指定できるというかFTPがポート0番(つまり無効)、HTTPが8080というのがべたうちになっていて、HTTP側も0番にすると8080の待ちうけも無効になる。既に構築済みのDBからHTTPを消したい場合はDBAでSQL*Plusで入り、dbms_xdb.sethttpport(0)を実行すれば良い。これで(XMLDBの機能自体はアンインストールされないものの)HTTP待ちうけが消え純粋なOracle DBMSとして使う事ができる。また、私は試していないがXMLDB3.0を追加でインストールできるらしいのでcreatedb.shしたらそちらを試すのも良いだろう。
 ついでにcreatedb.shではsysとsystemのパスワードは「oracle」固定となる。必要なら後で変更するよろし。

 DBMSとしての性能はまぁOracleだから良いのだろう。Oracle 10g Database Standardと比べてもいくつかのストアドパッケージが無いようだが、テーブル作ってデータ出し入れをするだけなら全く問題ない。使用可能メモリのMAXが1GBという事だが、残念ながら当方は個人的にメモリが1GBを越えるようなパソコンを持っていないので検証できなかった。データがMAXで5GBを検証してみると、REDOなども含めて全データファイルが合計で5200MBくらいになるとXE専用のエラーメッセージ「データは5Gまで!」が出てそれ以上エクステントの拡張ができなくなるようだ。なので、REDOやSYSTEM表領域をぎりぎりまで減らせばその分USERSテーブルスペースに多くのデータをぶっこめる。USERSを4.7GBまで使う事ができた。XDBスキーマなどを削ればもう少し入るのだろう。もちろん別の永続テーブルスペースを作る事もできる(それも含めて合計5GBだけど)。

 それ以外に検証した事。XEのデータをまるまる残したまま別のインスタンス名でcreatedb.shしてみると、これまたXE専用のエラー「複数インスタンスはダメっす」が出る。そりゃそうよね。ただ、SQL ServerはExpressでも一つのパソコンに16インスタンスまで作れて、1インスタンス中に複数のデータベースを作る事ができ、それぞれ(2005以降だと)4GBまでのデータを格納できるので、インスタンス数やDB容量に関してはSQL Serverに軍配が上がる。
 ユニバーサル版はインストール直後のconfigureでAL32UTF8なインスタンスが出来上がるため、createdb.shも無指定でそうなるのかと思ったらUS7ASCIIになってしまった。また、createdb.shを実行する時のユーザーoracleのLANGが日本語じゃないと(正確にはNLS_LANGがAMERICAN_AMERICA.US7ASCIIだったりすると)AL32UTF8を指定しててもUS7ASCIIなインスタンスが出来上がってしまった。Linuxだと生コンソールでcreatedb.shを実行するのは避けた方が良いかも知れない。