【資格】OSS-DB Silver にようやく受かった話


長らく放ったらかしにしていた試験をついに受けてきたのでメモ。

受験結果

OSS-DB Exam Silver(オープンソースデータベース技術者認定試験)
形式:50問90分、選択式
合格ライン:64点
スコア:76点

受験の経緯

アプリケーション開発を経験していくと、管理しているデータをどう扱うのか、欲しいデータをどのように取得してくるのかというところが重要に感じるようになり、DB・SQLをしっかり学習したいと思ったのがきっかけ。
元々スプレッドシート(+ほぼ使わなくなったけどエクセルも同様)に好きなデータをただまとめるという何気ない作業は好きな性分だったけど、Web開発においてスプシにまとめる感覚でデータを管理すると、いわゆる正規化ができてないから、追加更新削除といったデータの操作処理が増えるだけで効率が悪い。
データベースを基本から学びたいと思って取り掛かった。さらにOSS-DBは普段でも扱っているPostgreSQLを基準とした試験なので、OSS-DBを選択。

学習期間と教材

前置きでポジティブなことを書いたけど実際はあまり学習が進まなかった。
最初に学習始めたのは1年ぐらい前。他の勉強にも手をつけることもあり、最終的には2ヶ月集中して勉強した。

教材は最初は翔泳社のOSS教科書も活用してざっと最初の知識を入れていったが、1周ほど目を通した後はPing-tの演習問題が500問ほどあるのでフル活用した。
OSS教科書の練習問題は正直難易度が高く感じるので、学習はOSS教科書とPing-tの解説、問題演習はPing-t、余裕があればOSS教科書の練習問題を軽く見ておくぐらいで十分だと思う。Ping-tは認定教材なので信用していた。

https://www.shoeisha.co.jp/book/detail/9784798162553

Ping-tのOSS-DB問題は有料プランなので、3ヶ月とかで購入して集中的に学習できれば理想的。
自分は長めに買って、あまりにOSSの学習が進まないときは他の試験(HTML5とか)に手を出してた。

https://mondai.ping-t.com/g

出題範囲について

OSS-DBはオープンソースのリレーションデータベース管理システム、いわゆるPostgreSQLそのもの。
その中のどの分野が出るかというと、大きく分けると一般知識・運用管理・開発/SQLの3つに分かれる。
内容と学習において意識したポイントをざっと挙げていく。

一般知識

自分は正解率87%だった。ここは得点源にしたい。

1,オープンソースデータベースの一般的特徴
一般知識もあるので基本的なところは抑えておいた方がいい。自分の場合50問中最初の4問はここから出題された。「PostgreSQLは、元々はカリフォルニア大学バークレー校で開発されたデータベースが起源となっている」という話は結構出る。

2,リレーションデータベースシステム
ここは特に正規化。第1正規化・第2正規化・第3正規化の違い、YはXに関係従属するというのはどう表すのか、暗記ではなくイメージを掴むことが重要。

運用管理

自分は正解率65%。最初は結構イメージしづらい分野であり、設定まわりの細かい内容も幅広い範囲から出題されるので、最低でもPing-tに出ている内容は押さえておきたい。
最初の章から順番に学習していくと初見の内容がここからずっと続くため、SQLを触った経験があるなら先にSQLから学習するのも手。自分が学習に手こずったのも運用管理のところなので。

3,インストール
インストール方法は範囲外。データベースクラスタを作成するinitdbコマンドのオプション、データベースクラスタを作成するとどんな設定ファイルができるのか、initdbコマンドを実行できるユーザはどこまで限定されているのか、テンプレートデータベースのtemplate0とtemplate1の違いなど。細かいけどひとつずつ確認しておくこと。
データベースクラスタの制御情報を取得するpg_controldataコマンドについては、Ping-tには載っているがOSS教科書には載っていなかった。OSS教科書とPing-t、どちらかにのみ載っている内容が以後も存在するが、あまり重要度は高くはないと感じた。

4,標準付属ツール
ここもオプションの情報が多いが、まずほぼ全てのコマンドで共通する接続オプションを最初に押さえること。createuserとcreatedbのオプションは大文字小文字で全く意味が異なるため注意。
pg_ctl stopコマンドのシャットダウンモードの違いは重要。高速・即時・スマートの違いを押さえておきたい。
pg_ctl killコマンドとシグナル名を組み合わせてもシャットダウンできるため、どのpg_ctl stopコマンドと同じ意味なのかが問われる問題もある。自分は最初以下のように覚えていた。

高速   pg_ctl stop -m fast        =  pg_ctl kill INT [プロセスID]
即時   pg_ctl stop -m immediate   =  pg_ctl kill QUIT [プロセスID]
スマート pg_ctl stop -m smart       =  pg_ctl kill TERM [プロセスID]
高速→即時→スマートの順に、
fast → immediate → smartも、INT → QUIT → TERMもアルファベット順

5,設定ファイル
これまた細かいパラメータ情報がたくさんある。それぞれのパラメータの意味だけでなく、デフォルト値や反映のタイミングも細かく問われるため、Ping-tの演習問題を活用した。
自分の場合はサーバログの行頭に出力する内容を設定するlog_line_perfixパラメータの値について、%で始まる文字について問われる問題が出て、おそらく以下を抑えていれば確実に得点できた問題があった。見ての通り知っているか否かで得点に大きく関わるため、スラスラとPing-tを解けるようになるまでになっておいた方がいい。

主な%文字

%文字 置き換え
%u データベースユーザ名
%d データベース名
%p プロセスID
%t タイムスタンプ
%m タイムスタンプ(ミリ秒つき)
%% %の文字

6,バックアップとリストア
PITRがどういうしくみなのかはOSS教科書の説明が分かりやすかった。バックアップにはオフラインとオンライン、物理と論理それぞれがあり、違いをおさえておくこと。pg_dumpコマンドを使ってもテキスト形式か否かでリストアするコマンドが異なるため、どのコマンドが使えるのかは確認しておくこと。COPY文と\copyコマンドは似ている箇所が多いためサクッと解答できるようにしておきたい。

7,基本的な運用管理
初見ではうんざりするような内容が多いが、割と出題される。
VACUUM・ANALYZEのしくみはOSS教科書の説明が分かりやすかった。vaccumdbコマンドのオプションは不要領域の回収と統計情報の収集更新の2軸を基に、どのオプションがどれにあてはまるのかを整理するとよい。
システム情報取得関数は末尾にカッコがつくか否かで正誤をつけている問題もあった。情報スキーマとシステムカタログの名称や移植性の違いも押さえておきたい。テーブルの権限を設定するGRANT文とREVOKE文も、テーブルに対する権限と考えるとテーブルをまるごと消してしまうDROPが指定できないのも理解できるはず。

運用管理は自分でイメージできるようになるまで学習しておくと対策としては万全。

開発・SQL

自分の場合得点率が87%。基本的なSQLの読み取り問題も多いため得点源にしたい。

8,SQLとオブジェクト
基本的なSERECT/INSERT/UPDATE/DELETEもよく出る。結合もいろいろな種類があるから確実に得点源にしたい。
自分はIN/NOT INとEXISTS/NOT EXISTSが混同して詰まった。IN/NOT INは副問い合わせの結果に一致するものorしないものを判定し、EXISTS/NOT EXISTSは副問い合わせの結果が存在するかどうかを判定するもの。さらにEXISTS/NOT EXISTSは副問い合わせ部分に主問い合わせ(FROM)で指定したテーブルが指定されているかどうかで取得する件数が異なるため注意が必要。

データ型は正直覚えているかどうかなので半分諦めた。数値型のサイズとか細かすぎるし。ただ型変換の関数、to_char()・to_number()は出題されたのでおさえるべし。

そしてこの試験学習でほぼ始めて知った、パーティション・シーケンス・ビュー・インデックス・トリガー・ルール・スキーマ・関数とプロシージャ・テーブルスペース・マテリアライズドビュー・ドメイン・プリペアド文。
それぞれの役割と基本的な構文は一度目を通しておきたい。ルールやインデックス、トリガーはALTERで名称のみ変更できる、インデックスの削除はテーブルの指定はいらない、といった感じで。自分は演習を重ねることで徐々にイメージをつけていった。
50問中10問~15問はSQLからの出題だったかな。

9,組み込み関数と演算子
得点源にしたいけどそこまで出題されず。学習の際はここから手を付けて、わかるものから範囲をつぶしておけば後々ラクかも。

10,トランザクション
トランザクションの概念のところ、4つの特性の英単語の組み合わせは何気ないけど目を通しておくべし。トランザクション内でエラーが起きたらすべての処理がキャンセルされる、セーブポイントが復元されるしくみ、分離レベル指定と防ぐことができる現象についてはおさえておき得点源にしたい。

所感

ざっと書いたけど、運用管理の部分は本当に理解するのが大変だったので、分かるところから出題範囲をつぶして、計画的に学習していくことで、挫折しにくくなるかなと思います。

SQLについてはまた整理したいネタが出てきたらまたここでアウトプットしていきます。

OSS-DB Goldを受けるかどうかは全くの未定。