KDOC 640: 関連が少ないレコードで破壊的に時間がかかる現象

この文書のステータス

  • 作成
    • 2026-09-30 貴島
  • レビュー
    • 2026-09-30 貴島

概要

関連レコードが少ないユーザのほうが、多いユーザより100倍以上遅くなることがあった。

結局、関連のある1レコードを辿るようなクエリになっていて、レコードが少ないほど発見しにくく全件取得していた。また、レコードが少ないとシーケンシャルに取得する実行計画が選ばれ、破壊的に遅くなった。

事象のメモ。

  • ユーザに関連する特定のテーブルの SELECT が、破壊的に時間がかかることがある。もともと早くないところが100倍以上遅くなって、数分レベルで時間がかかる
  • DBやインフラにスパイクや変わった点は一切なく、負荷や入出力に時間がかかっているようにも見えない。同時刻のほかのクエリは問題なく動く
  • ユーザ × タイミングによって発生する
    • 最近会員登録したような、レコードが 少ない ユーザでのみ発生する
  • そのテーブルの全レコード数は60万件程度で、ユーザ1人が関連するレコードは100件程度
  • レコードが多いユーザと少ないユーザでパラメータだけ変えて SELECT すると、実行計画は異なっている。結合方法が異なっていて、多いユーザは Hash Join で子テーブルを1回だけ読む。少ないユーザは Nested Loop Semi Join で、親の1行ごとに子テーブルのインデックスを先頭から走査する

異なる実行計画から明らかに遅そうには見えるのだが、100倍の速度低下は再現できなかった。なにか別の要因が組み合わさっているようにも見える。

関連

なし。