QUIZ 30分

合格基準

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分