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倍の速度低下は再現できなかった。なにか別の要因が組み合わさっているようにも見える。
関連
なし。