合格基準
8問中7問正解(80%以上)で合格
Q1: B-Treeインデックス
B-Treeインデックスが効かないクエリはどれか?
- A)
WHERE email = 'user@example.com' - B)
WHERE created_at >= '2024-01-01' - C)
WHERE name LIKE '%tanaka' - D)
WHERE id IN (1, 2, 3)
回答と解説
正解: C
後方一致(LIKE '%tanaka')ではB-Treeインデックスが使えない。B-Treeは左端から順にソートされているため、前方一致(LIKE 'tanaka%')は効くが、後方一致は全行スキャンになる。全文検索インデックス(GIN + pg_trgm)で対応する。
Q2: 複合インデックス
複合インデックス CREATE INDEX idx ON orders(user_id, status, created_at) が効くクエリはどれか?
- A)
WHERE status = 'paid' - B)
WHERE user_id = 1 AND status = 'paid' - C)
WHERE status = 'paid' AND created_at > '2024-01-01' - D)
WHERE created_at > '2024-01-01'
回答と解説
正解: B
複合インデックスは左端のカラムから連続して使用される。(user_id, status, created_at) の場合、user_id を含むBが効く。A, C, Dはいずれもuser_idを含まないため、このインデックスが活用されない。
Q3: EXPLAIN ANALYZE
EXPLAIN ANALYZEの結果で「Seq Scan」が表示された場合、最初に確認すべきことは?
- A) サーバーのメモリを増やす
- B) テーブルを削除して再作成する
- C) 検索条件のカラムにインデックスがあるか確認する
- D) PostgreSQLのバージョンをアップグレードする
回答と解説
正解: C
Seq Scan(フルテーブルスキャン)は、適切なインデックスがないか、インデックスが使えないクエリパターンで発生する。まずWHERE句のカラムにインデックスがあるかを確認し、なければ追加を検討する。
Q4: N+1問題
N+1問題の最も適切な解決策はどれか?
- A) クエリ結果をキャッシュする
- B) JOINまたはIN句で一括取得する
- C) データベースのコネクション数を増やす
- D) 非同期でクエリを並列実行する
回答と解説
正解: B
N+1問題はループ内で個別クエリを発行することで発生する。JOINで1クエリにまとめるか、IN句/ANY句で2クエリに減らすのが根本的な解決策。キャッシュや並列化はワークアラウンドであり根本解決ではない。
Q5: ページネーション
大量データのページネーションで、OFFSET方式の代わりに使うべき手法は?
- A) LIMIT を大きくする
- B) カーソルベース(Keyset)ページネーション
- C) 全件取得してアプリケーションで切り出す
- D) ランダムサンプリング
回答と解説
正解: B
カーソルベース(Keyset)ページネーションは、前ページの最後のレコードの値を基準に次ページを取得する。OFFSETのように大量行をスキップする必要がなく、深いページでもパフォーマンスが安定する。
Q6: GINインデックス
GINインデックスが最も適している用途はどれか?
- A) 数値の範囲検索
- B) JSONB型の包含検索
- C) 主キーの等価検索
- D) 日付のソート
回答と解説
正解: B
GIN(Generalized Inverted Index)は転置インデックスの一種で、JSONB、配列、全文検索に最適。@> 演算子(包含)や @@ 演算子(全文検索マッチ)で威力を発揮する。
Q7: パーティショニング
Range パーティショニングが最も適しているテーブルはどれか?
- A) ユーザーマスタテーブル(100万行)
- B) 時系列ログテーブル(10億行)
- C) 商品カテゴリマスタ(100行)
- D) 設定値テーブル(50行)
回答と解説
正解: B
Range パーティショニングは時系列データに最適。日付範囲でパーティションを分割し、特定期間のクエリでパーティションプルーニング(不要なパーティションをスキップ)が効く。小さいテーブルにパーティショニングは不要。
Q8: パーティショニングとシャーディング
パーティショニングとシャーディングの違いとして正しいものはどれか?
- A) パーティショニングは複数DBサーバーに分散する
- B) シャーディングは同一DB内でテーブルを分割する
- C) パーティショニングは同一DB内、シャーディングは複数DBサーバーに分散する
- D) 両者に違いはない
回答と解説
正解: C
パーティショニングは同一データベースサーバー内での論理テーブル分割。アプリケーションからは透過的に1テーブルとして見える。シャーディングは複数のデータベースサーバーにデータを物理的に分散し、アプリケーション層での対応が必要。
結果
合格(7問以上正解)
インデックスとクエリ最適化の基礎をしっかり理解しています。Step 3「NoSQLの世界を探検しよう」に進みましょう。
不合格(6問以下)
Step 2 のレッスンを復習してから再挑戦してください。特に以下を重点的に:
- インデックスの種類と使い分け
- EXPLAIN ANALYZEの読み方
- クエリチューニングの技法
推定所要時間: 30分