ナスです。

とある検証のために環境を準備した際にハマったことです。

作りたかった環境

EC2 × 1
OS: CentOS7
DB: Oracle12c
  DBの中に表領域数個と1つの表領域のテーブルの中に100万件レコードを入れる

たったこれだけなのに2日間もかかってしまったので、二度と同じ過ちを犯さないため&私みたいに DB に詳しくない人が同じところで困らないように書き残しておきます。

Oracle にテーブルを作るまで

CentOS の EC2 を起動した場合、ssh アクセスするユーザは centos です。まずこれで半日はかかりました…

Oracle をインストールするのは簡単です。
HowTos/Oracle12onCentos7 – CentOS Wiki

ただ、作られると思っていた orcl データベースが中途半端に出来上がり、mount できない状態でした。色々試したけど制御ファイルがどこにも見当たらなかったので、諦めようとしてたら、新しくデータベースを作ればいいことに気がつきました。

create database って SQL 文で作れるみたいですが、これはこれでなんかオプションいっぱいあるなーと思って途方に暮れてました。

で、さらに根気よく調べていくと、dbca っていうお手軽 GUI ツールがあることを知りまして、やってみると簡単に作れちゃいました。

oracle ユーザで ssh -X でログインした後に、dbca とだけ叩いて起動します。まずは何をするかを選択。今回はdb作る、で。

 20161202000021

db作るのに必要な情報を入れて次へ。

20161202000031

あとは前提条件チェックが走って、実際に DB が作られます。むちゃくちゃ楽チンでした。

サンプルデータ100万件入れる

さっき作った DB にサンプルデータはどうやって入れようかと調べてたら、最終的に Oracle さんの web にたどり着きました。

しばちょう先生の試して納得!DBAへの道 第3回 データ領域管理の理解~SQLチューニングにも挑戦~

ここの「再帰的With句を活用したSQL」という手法で100万件作ったんですが、5秒くらいで終わりました。早い。ただ、残念ながら、この再帰的With句がまだちゃんと理解できてません… またの機会に調べよう。

↓はこのページからの引用。

SQL> insert into 
  select i+j,rpad(to_char(i+j),100,'A')
    from  (
           with DATA2(j) as (
                             select 0 j from DUAL
                               union all
                             select j+1000 from DATA2 where j < 999000
                            )
           select j from DATA2
          ),
          (
           with DATA1(i) as (
                             select 1 i from DUAL
                               union all
                             select i+1 from DATA1 where i < 1000
                            )
           select i from DATA1
          );

と、ここまで書いてみて全然大したことしてないように見えますが、知識がないとこういう作業も数日かかってしまうので、いろんなことに手を出して勉強してみるのも大事だなと思いました。

元記事はこちら

Oracle on CentOS にサンプルデータを入れるまで [cloudpack OSAKA blog]