ぱと隊長日誌

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

PostgreSQL 11 での DEFAULT 指定した列追加時の処理速度改善は NOT NULL 制約との組み合わせに限らない

概要

PostgreSQL 11 にて ALTER TABLE で列を追加する際に、NULL でないデフォルト値を指定しても全行の書き直しが不要となりました。これにより、PostgreSQL 10 以前では長時間かかることのあった処理がごく短時間で済むようになりました。

この改善を解説する記事では NOT NULL 制約と組み合わせているケースがありますが、実際には NOT NULL 制約無しでも同様の効果が得られます。

解説

PostgreSQL 11 にて ALTER TABLE で列を追加する際に、NULL でないデフォルト値を指定した場合の処理が変更されました。これにより処理時間の短縮が期待できます。

ALTER TABLE が列を追加するにあたって、全行の書き直しをすることなく非NULLの定数デフォルト値を付与することができるようになりました。 (Andrew Dunstan, Serge Rielau) (11)

PostgreSQL 11 に関する技術情報

ADD COLUMNで列が追加され、非変動性のDEFAULTが指定されたときには、デフォルトは宣言時に評価されてテーブルのメタデータに格納された結果です。 この値は全ての既存行の列に使われます。 DEFAULTが指定されなかった場合にはNULLが使われます。 どちらの場合もテーブルを書き直す必要はありません。

ALTER TABLE

内部処理についてはこちらの記事で解説されています。
A Missing Link in Postgres 11: Fast Column Creation with Defaults — brandur.org

この改善を解説する記事では NOT NULL 制約と組み合わせて検証しているものがいくつか見られました。ですが、実際には NOT NULL 制約の有無にかかわらず、この改善の恩恵を受けることができます。

検証

検証環境を以下に示します。

検証に用いたクエリを以下に示します。

DROP TABLE item;

CREATE TABLE item(id INTEGER NOT NULL, name TEXT NOT NULL);

INSERT INTO item SELECT val, 'aaa' FROM generate_series(1, 50000000) val;

VACUUM ANALYZE;

\timing

-- DEFAULT 指定無しの場合
ALTER TABLE item add quantity INTEGER;

-- DEFAULT 指定有り & NOT NULL 制約無しの場合
ALTER TABLE item add quantity INTEGER DEFAULT 0;

-- DEFAULT 指定有り & NOT NULL 制約有りの場合
ALTER TABLE item add quantity INTEGER NOT NULL DEFAULT 0;

列追加の処理時間は3回の測定の中央値を採用しました。

結果を下表に示します。

条件 PostgreSQL 10 PostgreSQL 11
DEFAULT 指定無し 6.889 ms 6.872 ms
DEFAULT 指定有り & NOT NULL 制約無し 41246.829 ms 7.212 ms
DEFAULT 指定有り & NOT NULL 制約有り 41068.293 ms 8.244 ms

PostgreSQL 11 では NOT NULL 制約の有無にかかわらず、DEFAULT 指定有りの処理速度改善が確認できました。

補足

今回の記事の主題と少しずれますが、列の追加や変更で依然として処理に時間のかかるケースがあることには注意が必要です。

変動性のDEFAULT句を持つ列を追加したり、既存の列の型を変更するには、テーブルとインデックス全体の書き換えが必要になります。

ALTER TABLE

「変動性のDEFAULT句」の例として下記の説明が参考になります。

Due to the relative simplicity of attmissingval, this optimization only works for default values and function calls that are non-volatile. Using it with a volatile function like random() won’t set atthasmissing and adding the default will have to rewrite the table like it did before. Non-volatile function calls work fine though. For example, adding DEFAULT now() will put the transaction’s current value of now() into atthasmissing and all existing rows will inherit it, but any newly inserted rows will get a current value of now() as you’d expect.

A Missing Link in Postgres 11: Fast Column Creation with Defaults — brandur.org

SRA OSS の発行した「PostgreSQL 11 検証レポート」では、値の入った列の型変更で PostgreSQL 11 でも依然として時間を要していることを検証しています。
PostgreSQL 11 検証レポート
4.5. ALTER TABLE .. ADD COLUMN の追加性能の追加改善

ソースコードからインストールした PostgreSQL をマイナーアップグレードする

概要

ソースコードからインストールした PostgreSQL をマイナーアップグレードするには、新規インストールと同じ手順を踏みます。

詳細

PostgreSQL のマイナーリリースの間には互換性があります。

マイナーリリースでは内部格納書式が変わることは決してありませんので、同じメジャーバージョンにおける前後のマイナーリリースとの間で常に互換性があります。 例えばバージョン10.1はバージョン10.0やバージョン10.6と互換性があります。 同様に、例えば9.5.3は9.5.0、9.5.1、9.5.6と互換性があります。 互換性があるバージョンとの間で更新するためには、サーバを停止させ、実行ファイルを置き換え、サーバを再起動させるだけです。 データディレクトリはまったく変更されません。 マイナーリリースのアップグレードは簡単です。

18.6. PostgreSQLクラスタのアップグレード処理

この説明に『マイナーリリースのアップグレードは簡単です』とあるものの、ソースコードからインストールした PostgreSQL のアップグレード手順は示されていません。

ですが、実際に簡単です。『サーバを停止させ、実行ファイルを置き換え、サーバを再起動させるだけ』です。実行ファイル置き換えは新規インストール時と同じ手順、つまり、以下に示すマニュアルに従って実行するだけです(リンク先は PostgreSQL 12 です)。
16.3. ソースの入手
16.4. インストール手順

PostgreSQL 12.1 をインストールした後、12.6 へアップグレードする例を示します。
/root/postgresql-12.X にソースコードが展開されているものとします。

◆ PostgreSQL 12.1 のインストール
# cd /root/postgresql-12.1
# ./configure
# make
# make install

◆ PostgreSQL 12.6 へのアップグレード
# cd /root/postgresql-12.6
# ./configure
# make
# make install

実証実験で確認したことを挙げておきます。環境は Linux, PostgreSQL 12 です。

もし慎重を期すのであれば、メジャーアップグレードの手順が参考になります。
18.6. PostgreSQLクラスタのアップグレード処理

JSTQB AL テストアナリスト 受験記録 (2021/02/13)

略記について

本エントリ内では以下の略記を用います。教材については略記を個別に定義しました。

略記 名称
FL Foundation Level
AL Advanced Level
TA テストアナリスト

教材と利用方法

Advanced Level シラバス 日本語版 テストアナリスト

JSTQB認定テスト技術者資格-シラバス(学習事項)・用語集-

略記:TAシラバス

本試験において教科書代わりになる資料です。

私の場合、スクエアリングサービスの提供するシラバス解説書(後述します)で代わりとしたため、通読したのは1回ぐらいでした。後は適宜調べるために利用しました。

Advanced Level サンプル問題 日本語版 テストアナリスト

JSTQB認定テスト技術者資格-シラバス(学習事項)・用語集-

略記:TAサンプル問題

日本語版公式のサンプル問題です。問題数の少ないのが難点。

過去の経験上、同様の問題を出題される可能性が高いです。

JSTQB による Advanced Level 過去出題問題の解説セミナー資料

JSTQB認定テスト技術者資格-イベント-

略記:AL過去問セミナー

シラバスからどのように出題されるかを過去問題を例に解説しています。実際の出題形式を知ることができる、貴重な資料となります。

スクエアリング・サービス TAシラバス解説書

スクエアリングサービス

略記:TAシラバス解説書

スクエアリング・サービスの有料コース(イータコース)を利用しているとダウンロードできます。

シラバスを引用しつつ、分かり辛いところを解説してくれています。

シラバスよりも文字のフォントサイズが大きく、読みやすいです。

スクエアリング・サービス テスティング中級コース(アナリシス編)

スクエアリングサービス

略記:スクエアTA問題集

TA試験向けの日本語版の模擬試験サービスです。私は有料コース(イータコース)を利用しました。

未だ TLS (HTTPS) でのサービス提供を行っていないのがちょっと残念です。

スマホ対応版(レスポンシブWEB)があり、通勤中にスマホで問題を解くのも快適です。私としてはタブレットで利用するのが最も快適でした。

問題毎に丁寧な解説が付いています。解説の内容に納得がいかなければ、問い合わせることで回答をいただけたり、記述の見直しが行われたりします。

アクセスが増えると動作が不安定になる傾向があるようです。試験数日前から混雑が激しくなるので、直前の追い込みには注意が必要です。

JSTQB Advanced Level テストアナリスト非公式問題集

【PDF】JSTQB Advanced Level テストアナリスト問題集 - JSTQB Advanced Level 非公式問題集 - BOOTH

略記:TA非公式問題集

JSTQB Advanced Level 試験勉強会」の発行する同人誌です。テストアナリスト試験に向けて作成した模擬問題50問が収録されています。

PC+大きいディスプレイだと問題と解答・解説を同時に表示して学びやすいです。

はじめて学ぶソフトウェアのテスト技法

略記:はじめて学ぶテスト技法

TAシラバスの参考文献であり、AL過去問セミナーでもお勧めされていた本です。

初期のうちに技法を知るために一通り読んでおくのがよさそうです。

以前にこの本の補足記事を書きましたので、併せて参照ください。
「はじめて学ぶソフトウェアのテスト技法」の読解メモ - ぱと隊長日誌

ソフトウェアテスト技法練習帳

略記:テスト技法練習帳

座学で学んだソフトウェアテスト技法を様々なパターンの問題で実践することができます。

取り上げられている技法はTAの出題範囲に含まれています。

ソフトウェアテスト教科書 JSTQB Foundation 第4版 シラバス2018対応

略記:FL教科書

基礎知識の復習の為に取り組みました。

TAのシラバス発行時期を考えると第3版を用いるのが適切にも思えます。ですが、日科技連に出題範囲のシラバスのバージョンを確認したところ、JSTQBのWebサイトに掲載された最新版が対象とのことでしたので、第4版としました。

なお、対象のシラバスについてはFAQにも記載があります。

試験の実施及び公認ベンダー、公認書籍のアクレディテーションにおいて、最新年度のシラバスを使用してください。

JSTQB認定テスト技術者資格-FAQ-

スクエアリング・サービス テスティング基礎コース

スクエアリングサービス

略記:スクエアFL問題集

FL試験向けの模擬試験を提供しています。

無料コース(スクエア・テイスタ)でも132問提供されており、復習用途であれば十分と考えています。

勉強時間と進め方

勉強時間の測定にはStudyplusのスマホアプリを利用しました。
学習総合サイト Studyplus(スタディプラス)

2020/10 2020/11 2020/12 2021/1 2021/2 小計
TAシラバス 2.75 2.75
TAサンプル問題 0.5 0.5
AL過去問セミナー 0.25 0.75 1.0
TAシラバス解説書 2.5 4.5 1.5 8.5
スクエアTA問題集 0.25 9.0 26.25 17.5 53.0
TA非公式問題集 8.5 2.5 11.0
はじめて学ぶテスト技法 5.5 5.5
テスト技法練習帳 0.5 1.0 2.5 2.75 6.75
FL教科書 2.75 6.5 9.25
スクエアFL問題集 3.25 3.25
小計 0.25 3.25 30.75 41.75 25.5 101.5

(単位:時間)

まずは FL の復習として「FL教科書」と「スクエアFL問題集」に取り組みました。

FL の復習を一通り終えた後に TA の勉強に取り掛かりました。

「はじめて学ぶテスト技法」でテスト技法を学びました。

「AL過去問セミナー」で出題パターンをつかみました。

「TAシラバス」を一通り読んだ後に「TAシラバス解説書」を読みました。今から振り返ると、「TAシラバス解説書」はシラバスの内容+解説なので、最初からこちらだけを読んでいればよかったです。

シラバスの読み込みと並行して「スクエアTA問題集」に取り組みました。知識問題は通勤中に取り組み、計算・シナリオ問題は土日に自宅で取り組みました。一通り解いたらリセットし、また一から解き直すということを繰り返し、最終的に4周しました。

「TA非公式問題集」は土日に自宅で取り組みました。こちらは2周しました。

「テスト技法練習帳」は会社に置いておき、始業前などに取り組みました。仕事が忙しくて、始業前の時間の確保すらできず、1周終わる前に時間切れとなりました。

何度も間違えてしまう問題が見つかったときは、その理由を研究しました。解き方のポイントがみつかったときは要点メモとしてまとめました。

受験直前の復習で「TAシラバス解説書」や自分でまとめた要点メモを見返しました。

今回の期間での総勉強時間は100時間をなんとか超えました。ですが、150時間は欲しいところでした。それだけあれば他の参考書籍を読み込んだり、「テスト技法練習帳」をもう1周解けたからです。

目標勉強時間に到達できないことは早い段階で判明していたので、合格することよりも次回に向けた種まきを意識しました。例えば、「スクエアTA問題集」で解説の不明確な部分は補足をお願いしたり(問い合わせ)、「TA非公式問題集」の Issue を起票するなどしました。

試験の振り返り

解答ペース

私の場合、3時間の試験時間の内、2時間強で一通り解き、残りの時間で見直しを行いました。見直しは1/3程度しかできなかったので、後から直すのではなく、最初から丁寧に解答するのがよさそうです。

試験時間が3時間あるといっても、あっという間に時間が過ぎていきます。解けないとか難しいと感じた問題は後回しにしました。その際にマークシート記入ミス(ずれ)には気を遣いました。

出題傾向

JSTQBの問題用紙の持ち帰りを認めず、公開もしないというポリシー(JSTQB認定テスト技術者資格-FAQ-)を尊重し、本節をまとめています。このため、具体的なケースには言及せず、どのような勉強が必要かを示すことにしました。

JSTQB認定テスト技術者資格のFAQには以下の記述があります。

JSTQBは、引っかけ問題のようなものを可能な限り排除し、きちんと理解していれば点数が取れるような問題を作成しております。

JSTQB認定テスト技術者資格-FAQ-

今回の問題はこの記述通り、素直な問題が多かった印象でした。

テスト技法を実践させる問題が1/3~1/2程度ありました。対策としては「スクエアTA問題集」「TA非公式問題集」「テスト技法練習帳」が役に立ちます。

必要なテストケース数を問う問題が多かったです。簡単に算出できる方法(公式)があればまとめておくと良いでしょう。

デシジョンテーブルを実際に書き出さないと解けないような問題は少なかったです。ただ、テストケース数を算出する方法は知っておいたほうが良いでしょう。

AL過去問セミナーに『クラシフィケーションツリーの使い方を知っていて、実際に適用してテスト設計を行えること』とある通り、実際に手を動かせるようにしておくべきです。

テスト技法とその特徴(どのような場合に有効か?)を覚えておくべきです。

AL過去問セミナーとよく似た問題が出題されていました。

知識問題は細かい点を問う(シラバスを丸暗記しないと解けないような)問題は少なく、実務を思い起こして答えられる事が多かったです。シラバスを読みながら実務をイメージして覚えるとよいでしょう。

状態遷移テストの模擬問題で A → B のように状態遷移することはあっても、A → A のように状態遷移し、かつこれを含めたNスイッチカバレッジを問われるものは少ないように思えます。ですが、これもありうるパターンということで解けるようになっておきましょう。

TA非公式問題集の TA-1.4.1-1 の解説にテスト計画作業で行うテスト分析の進め方をフローチャートで示しています。このフローチャートは頭に入れておきましょう。

ロジックの処理順序を考慮したデシジョンテーブルの簡単化の手法を覚えておきましょう。これはテスト技法練習帳で解説されています。

2値の境界値を使うべきか、3値の境界値を使うべきかは問題の中で明示されていました。

解法テクニック

長文問題には問題を解くために不必要な記述も多くあります。なので、最後の質問(問われていること)を確認してから問題を読むのがよさそうです。

問題文を熟読する時間はありません。サラッと読みつつ、重要なキーワードをマーキングしていきましょう。重要なキーワードの例を挙げると、時間が無い、監査がある、仕様に詳しくない、テスト初心者のメンバーがいる、チェックリストがある、などです。
こうしたキーワード(状況)の時にどのような手段を取るべきかはある程度パターンがあります。このようなキーワードとパターンはサンプル問題や模擬問題集の解説を読み込むと見えてきます。

AL過去問セミナーでは選択肢を○△×で評価し、絞り込みを行っています。実際の試験でもこのテクニックは有効でした。私の場合、選択肢の文章の一部分に対しても○△×で評価し、最終的な絞り込みに活用しました。

「〜ではないものを選べ」のように否定形の問題は傍点で強調されていますが、傍点が小さくて見落としがちなので、自分でも下線を引くなどしたほうがよいです。

異なる選択肢に同じ項目が複数回登場するからといって正答の可能性が高いとは限りません。
TAサンプル問題 CTAL-ATA_LO-6.4.1 を例に挙げます。
ここでは選択肢に「重大度別の未解決な欠陥」は1回、「優先度別の未解決な欠陥」は2回現れています。ですが、正解の選択肢に含まれているのは「重大度別の未解決な欠陥」でした。

挑戦の振り返り

今回はデータベーススペシャリスト試験に続けての挑戦だったこともあり、期間が短い中での挑戦となりました。また、家事・育児・仕事・体調管理のいずれにも手を抜かずにこなすため、勉強に費やせる時間は大きな制限を受けました。ですが、通勤時間・始業前・昼休みをフル活用し、かつ有給休暇も費やし、やれることはやり切ったと感じられる準備期間となりました。

今回は合格できないかもしれないという覚悟を決め、次回に向けた種まきに徹しました。案外手ごたえを感じたので、ちょっと期待してしまうところはありますが、例え不合格に終わったとしても、次回挑戦への熱意を失わず今後も取り組んでいきます。