ぱと隊長日誌

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

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

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

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

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

第1章 問13

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

第4章 問15

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

第4章 問26

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

第4章 問36

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

第10章 問1

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

http://www.oss-db.jp/measures/dojo_01.shtml

第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

「SQLパフォーマンス詳解」(原文タイトル:SQL Performance Explained)の紹介と購入時のポイント

本の紹介

SQLパフォーマンス詳解」(原文タイトル:SQL Performance Explained)はデータベースのBツリーインデックスについて解説しています。インデックスの仕組みから実務に活かせるテクニックまで幅広く取り上げられています。
データベースのインデックスは本やセミナー資料で度々取り上げられる内容ですが、この本はそれらの内容を1冊にまとめ上げています。どこかで見たのだけど…と探して回る前に、この本を紐解けばすぐにみつかるかもしれません。

本はOracleを中心とした構成ですが、補足でMySQLPostgreSQLSQL Serverについても解説しています。著者によれば、Bツリーインデックスは多くのデータベースでほぼ同じように動作すると述べていますし、どのデータベースでも通用する内容となっています。

実はこの本のほぼ全文がオンラインで公開されています。
Use The Index, Luke
データベースのインデックスやパフォーマンスチューニングについて調べているうちに、このサイトへたどり着いた方も多いのではないでしょうか。私もPostgreSQLのインデックスについて調べているうちにたどり着きました。

Webにて無償で公開されているものを購入するのはもったいなく感じるかもしれません。私の場合は著者(@さん)及び翻訳者(@さん)へ恩返ししたいという気持ちからPDF版を購入しました。また、Web版よりPDF版のほうがよみやすく感じました。

まずはオンライン版で内容を確認し、興味を持たれたら購入を検討されてはいかがでしょうか。

日本語版の購入方法

購入サイトはこちらになります。
SQLパフォーマンス詳解
念のためVirusTotalでスキャンしましたが、Clean Siteとの判定でした(2017/03/05時点)。

印刷版とPDF版があります。
印刷版は海外のAmazon(.com/.co.uk/.de)で購入できます。上記サイトから遷移できます。なお、現時点で日本のAmazonからは購入できません。
PDF版は上記サイトから購入できます。2017/03/05時点で9.95ユーロ(約1,300円)でした。

上記サイトからの購入の場合、価格表示はユーロです。支払いはPayPalを利用しています。

PDF版購入の場合、プルダウンでPDFを選択し、「レジへ」ボタンをクリックするとPayPalへ遷移します。PayPalで支払いを済ませると、PayPal登録のメールアドレスへPDF版ダウンロードリンクを含んだメールが届きます。

割引コードの適用

利用可能(2017/03/05時点)な割引コードがありました。PDF版であれば9.95ユーロが5.00ユーロへディスカウントされます。

@さんのブログにコードが記載されています(ここではコードを転記しません)。
SQLのインデックスについて解説した洋書が良かった件。PDF版もあるよ(2012/10/22までの割引購入クーポン有) - Dマイナー志向
ただ、上記エントリによれば本来は2012/10/22で期限が切れるはずだったので、著者が寛大なのか、それとも無効化を忘れているだけかもしれません。
このような背景があるため、購入時点で割引率が変わっていたり、無効になっていたとしてもご了承ください。

割引コードの入力方法を説明します。
「レジへ」ボタンの下にある「割引コードを入力」リンクをクリックします。
割引コードを入力し、「買い戻す」ボタンをクリックします。
すると、表示された価格が当初よりディスカウントされているはずです。コードが無効な場合はエラーとなります。

f:id:pato_taityo:20170305164327p:plain

PayPal支払いでの為替レートと手数料

海外サイトでの購入で気になることの一つに為替レートと手数料があります。
PayPalでは為替レート及び手数料をPayPalとクレジットカード会社から選べます(一部のカードブランドでは選べないようです)。詳細については以下の記事を参照ください。
PayPalの高い日本円の為替手数料(レート)を安く節約する方法

まとめ

SQLのパフォーマンスを上げるためにはインデックスを理解することが重要となります。インデックスにはいくつか種類がありますが、中でもBツリーインデックスは基本といえます。この本(およびサイト)はその基礎知識を学ぶ上でお勧めできます。
今回の本をお勧めするにあたり、本の内容は公開されているため、不安を抱きやすい購入手順を中心にまとめました。ご興味を持たれた方の参考になれば幸いです。