ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

OSS-DB Silver [OSDBS-01] 受験対策教材集

はじめに

OSS-DB Silver [OSDBS-01] 受験対策の教材はあまり多くありません。ですが、よく探してみると、自習で役立つ資料が公開されていたりします。
このエントリでは私が受験対策のために実際に使い、参考になったものをご紹介いたします。

テキスト

OSS教科書 OSS-DB Silver

OSS教科書 OSS-DB Silver

OSS教科書 OSS-DB Silver

試験対策の最初の1冊としてPostgreSQLの全体像を知るためによいと思います。最後の章に模擬試験が付いています。
ただ、出題範囲の全てをカバーはできておらず、問題集で取り上げられた内容が本書には説明のないことがあります。また、出版されてから日が経っていることもあり、その後のアップデートをカバーできていません。
受験対策としても、そして業務に活かすためにも、この1冊を足がかりに公式ドキュメントや関連記事を読み込んだり、実際に環境を構築して触ってみることが必須です。

PostgreSQL日本語ドキュメント

PostgreSQL日本語ドキュメント
日本PostgreSQLユーザ会が翻訳・公開しています。
全てを読む必要はありませんが、テキストや問題集でわからなかったところはこまめに調べましょう。
ドキュメントはバージョン毎に用意されていますが、Silverの出題範囲を踏まえるとバージョン毎に大きく異なることはないと思われます。出題範囲に記載されている対応バージョンを参考にするか、悩んだら最新版でも問題ないと思われます。

OSS-DB Silverの出題範囲(対応バージョン含む)はこちらを参照ください。
出題範囲|DBスペシャリストを認定する資格 OSS-DB技術者認定試験

LPIセミナー(技術解説資料あり)

イベント・セミナー|DBスペシャリストを認定する資格 OSS-DB技術者認定試験
OSS-DB Exam Silver 技術解説無料セミナー』が目印です。イベント詳細ページに資料がアップされています(されていない場合もあります)。
ここでポイントなのが、このセミナーは担当講師が時折入れ替わっており、それに応じて資料の内容も入れ替わっています。時間が許せば複数読んでみるのもよいかもしれません。

OSS-DB道場

OSS-DB道場|受験対策|DBスペシャリストを認定する資格 OSS-DB技術者認定試験
LPIが公開しているPostgreSQLに関するコラムです。
各コラムはさくっと読める分量ですので、隙間時間や気分転換に読んでみてはいかがでしょうか。

問題集

徹底攻略 OSS-DB Silver問題集

徹底攻略 OSS-DB Silver問題集[OSDBS-01]対応 (ITプロ/ITエンジニアのための徹底攻略)

徹底攻略 OSS-DB Silver問題集[OSDBS-01]対応 (ITプロ/ITエンジニアのための徹底攻略)

現時点にて、書店で入手可能な唯一の問題集と思われます。
テキスト付属の例題や無償公開されている問題集もありますが、出題範囲に対する網羅度や解説の丁寧さを考慮すると、この問題集をベースに学習を進めるのがよいと考えています。

解説は丁寧ですが、一部補足したほうが分かりやすい箇所があり、別エントリにてまとめました。よろしければご参照ください。
OSS-DB silver問題集 [OSDBS-01]対応 補足 - ぱと隊長日誌

LPI公式サンプル問題

サンプル問題/例題解説|受験対策|DBスペシャリストを認定する資格 OSS-DB技術者認定試験
公式によるサンプル問題との位置付けですが、サンプルとは思えない問題数及び解説の内容となっています。
一般の問題集では出題傾向や内容に本番と差異の心配がありますが、公式であればそういった心配はないでしょう。受験前に取り組まれることをお勧めします。

ITトレメ

ITトレメ OSS-DB技術者認定試験 Silver − @IT自分戦略研究所
@ITが無償公開しているOSS-DB Silverの問題集です。
解説はあっさりした量ですが、99問が提供されているため、隙間時間の活用や最後の腕試しに良いかと思われます。

その他

LPIのサイトではOSS-DB Silver対応認定教材として、本エントリに含めていない教材についても紹介があります。よろしければご参照ください。
学習教材・教育機関のご紹介|DBスペシャリストを認定する資格 OSS-DB技術者認定試験

OSS-DB silver問題集 [OSDBS-01]対応 補足

OSS-DB Silver [OSDBS-01] 受験対策としてインプレスジャパンの問題集を利用されている方は多いかと思います。

徹底攻略 OSS-DB Silver問題集[OSDBS-01]対応 (ITプロ/ITエンジニアのための徹底攻略)

徹底攻略 OSS-DB Silver問題集[OSDBS-01]対応 (ITプロ/ITエンジニアのための徹底攻略)

問題毎に丁寧な解説が付いていますが、解説だけで理解することが難しい箇所もあります。
本エントリではこのギャップを埋めるべく、解説若しくは関連記事の紹介を行います。

なお、私は著者・編者・発行所のいずれとも無関係であることをご了承ください。

第1章 問13

テーブルスペースについて別エントリにまとめましたのでご参照ください。
PostgreSQLのデータベースクラスタ及びテーブルスペースの関係 - ぱと隊長日誌

第4章 問15

チェック制約におけるNULLの扱いについては別エントリにまとめましたので、ご参照ください。
PostgreSQLの検査制約におけるNULLの扱い - ぱと隊長日誌

第4章 問26

継承についてはPostgreSQLドキュメントを参照ください。
5.9. 継承
上記ドキュメントには親テーブルだけを対象としたいときはONLYキーワードを利用すること、一意制約が子テーブルに継承されないために起こる制約についての記載などもあります。

第4章 問36

EXISTSを使用したサブクエリについて別エントリにまとめましたのでご参照ください。
SQLのWHERE句で用いられる相関サブクエリを理解する - ぱと隊長日誌

第10章 問1

正規化について以下の記事が分かりやすいです。ボイス・コッド正規形以降についても解説されています。
データベースエンジニアへの道(3):素早く正規形を見抜く実践テクニック (1/4) - @IT

第10章 問4

解説にマテリアライズドビューはPostgreSQL 9.0でまだ実装されていないとなっていますが、9.3で実装されました。
OSS-DB最前線~2013秋~レポート PostgreSQL 9.3の新機能を解説 - クラウド Watch

第10章 問23

NATURAL JOINは2つのテーブルで同じ名前のカラム名を使って結合を行います。

最後に、NATURALはUSINGの略記形式で、2つの入力テーブルの両方に含まれているすべての列名で構成されるUSINGリストを形成します。 USINGと同様、これらの列は出力テーブルに一度だけ現れます。 共通する列が存在しない場合、NATURALはCROSS JOINと同様に動作します。

7.2. テーブル式

第10章 問25

PostgreSQLDDLトランザクションの一部となります。Oracleとは異なるので要注意です。

PostgreSQL では、CREATE TABLE や DROP TABLE などの DDLトランザクションの一部となるため、トランザクションの途中で DROP TABLE を実行した場合でも、最後に ROLLBACK すれば、DROP したテーブルが元に戻ります。
例えば Oracle では、DDL を実行すると、その時点で「自動 COMMIT」が発生し、それ以前の更新が自動的にデータベースに反映されます。DDLトランザクションの一部にはならないので、ROLLBACK できません。

第1回 トランザクションについて|オススメ!OSS-DB情報|OSS-DB道場|受験対策|DBスペシャリストを認定する資格 OSS-DB技術者認定試験

第10章 問30

解説で紹介されたtrim関数について補足します。

関数:
trim([leading | trailing | both] [characters] from string)
説明:
characters(デフォルトでは空白)で指定された文字のみを含む最も長い文字列を、stringの先頭、末尾、あるいはその両方から削除します。

9.4. 文字列関数と演算子

"characters"と複数形である通り、削除文字は複数指定できます。また、削除文字の順序は問いません。あくまで文字単位で評価されます。以下に実行例を挙げます。

select trim(both 'abc' from 'abccbaPOSTabccbaGRESabccba');
btrim
POSTabccbaGRES

第10章 問34

CREATE FUNCTIONのパラメータ"STRICT"についての説明を引用します。

RETURNS NULL ON NULL INPUTもしくはSTRICTを指定すると、関数の引数に1つでもNULLがある場合、常にNULLを返します。 このパラメータが指定されると、NULL引数がある場合、関数は実行されません。 代わりに、NULLという結果が自動的に与えられます。

CREATE FUNCTION

更新情報

2017/03/19

  • 第4章 問15の解説を追加しました。

PostgreSQLのデータベースクラスタ及びテーブルスペースの関係

はじめに

PostgreSQLの「データベースクラスタ」及び「テーブルスペース(テーブル空間)」の関係を説明します。

前提

このエントリではPostgreSQL 9.6のドキュメントをベースに解説します。

データベースクラスタ

PostgreSQLにおける「データベースクラスタ」とは1つのサーバインスタンスで管理するデータベースの集合体のことです。

ファイルシステムの観点からデータベースクラスタを見ると、『すべてのデータが格納される1つのディレクトリ』です。以下の記事の<図4:PostgreSQLファイル構成>がイメージしやすいです。
PostgreSQLアーキテクチャと性能の勘所

データベースクラスタ作成直後には3つのデータベース(posgres, template0, template1)が含まれています。

テーブルスペース(テーブル空間)

テーブルスペースはデータベースオブジェクト(データベース、テーブル、インデックス、シーケンス)の格納領域です。テーブルスペースを日本語版PostgreSQLマニュアルでは「テーブル空間」と表記しています。

デフォルトで用いられる格納領域のことを「デフォルトテーブルスペース」と呼びます。デフォルトテーブルスペースにはデータベースオブジェクトだけでなく、PostgreSQLの管理情報等(例えばトランザクションログ)も格納されます。

PostgreSQLのドキュメントではテーブルスペースを利用するメリットとして2つ挙げています。

(1)ディスクレイアウトの自由度が上がる
クラスタを作成したパーティションもしくはボリュームの容量が不足し、拡張を行うことができない場合でも、別パーティションにテーブルスペースを作ることでデータベースオブジェクトの増大に対応できます。

(2)データベースオブジェクトの特性に合わせて格納できる
頻繁にアクセスのあるインデックスを高速なSSDに格納したり、逆にアクセス頻度の低いテーブルを低速・低価格なハードディスクに格納することができます。

データベースクラスタとテーブルスペースの関係

先述の通り、データベースクラスタは『すべてのデータが格納される1つのディレクトリ』です。ですが、テーブルスペースはクラスタを作成したパーティション外にも作成できるとあります。一見矛盾しているこれらの要件ですが、PostgreSQLのドキュメントにヒントがあります。

ユーザが定義したテーブル空間はそれぞれ、PGDATA/pg_tblspcディレクトリ内に物理的なテーブル空間ディレクトリ(つまりそのテーブル空間のCREATE TABLESPACEコマンドで指定された場所)を指し示す、シンボリックリンクを持ちます。

65.1. データベースファイルのレイアウト

"PGDATA"は環境変数で、データベースクラスタディレクトリパスを示します。つまり、テーブルスペースのシンボリックリンクをデータベースクラスタ内に保持することで、『すべてのデータが格納される1つのディレクトリ』を実現しています。

なお、データベースクラスタ初期化時に2つのテーブルスペースが作成されます。

名称 パス 用途
pg_global PGDATA/global 共有システムカタログ用
pg_default PGDATA/base データベースのデフォルトスペース

これらはシンボリックリンクを介することなく、データベースクラスタ内のフォルダに紐付きます。

実例

テーブルスペースを作成・削除することでPGDATA/pg_tblspcディレクトリにシンボリックリンクが作成・削除されることの例を示します。理解を妨げない範囲で省略しています。

$ pg_ctl start -D /usr/local/pgsql/data/
$ ls -l /usr/local/pgsql/data/pg_tblspc
合計 0
$ ls -l /usr/local/
drwxr-xr-x. 7 postgres root 68 124 07:57 pgsql
drwxr-xr-x. 2 postgres root 6 39 22:18 pgsql_dbs
$ psql mydb
mydb=# CREATE TABLESPACE dbspace LOCATION '/usr/local/pgsql_dbs';
CREATE TABLESPACE
$ ls -l /usr/local/pgsql/data/pg_tblspc
合計 0
lrwxrwxrwx. 1 postgres postgres 20 39 22:24 16425 -> /usr/local/pgsql_dbs
mydb=# DROP TABLESPACE dbspace;
DROP TABLESPACE
$ ls -l /usr/local/pgsql/data/pg_tblspc
合計 0