Closed sakaik closed 1 week ago
本件、da05771daa205b684b2eb30ee5a7dbfb1ddde20e
でも確認してみたところ、
クラッシュはしなくなったのですが、超時間(30分以上)
NOTICE: GpuJoin: CPU fallback 0 tuples (0B)
が何度も出続ける(7秒に1回くらい)事象となりました。(不具合でfallbackがループし続けているのか、順調に処理が進行しる=時間が掛かっているだけ=状態なのかは検証していません)
参考:実行計画変わりました
db=# explain SELECT m.key_code , m.shape FROM chiri_mesh m, shinsui_geom s
WHERE m.key_code like '533925%'
AND ST_crosses(m.shape, s.g)=True
ORDER BY key_code ;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Gather Merge (cost=727416.75..890148.24 rows=1394744 width=130)
Workers Planned: 2
-> Sort (cost=726416.73..728160.16 rows=697372 width=130)
Sort Key: m.key_code
-> Parallel Custom Scan (GpuJoin) on chiri_mesh m (cost=623710.41..658731.30 rows=697372 width=130)
GPU Projection: m.key_code, m.shape
GPU Scan Quals: ((m.key_code)::text ~~ '533925%'::text) [rows: 2006141 -> 84]
GPU Join Quals [1]: st_crosses(m.shape, s.g) ... [nrows: 84 -> 697372]
GPU GiST Join [1]: (s.g && m.shape) on idx_gst_shinsui (g)
GPU-Direct SQL: enabled (N=1,GPU0-0)
-> Parallel Seq Scan on shinsui_geom s (cost=0.00..520805.47 rows=3120547 width=1030)
なお、このときの key_codeでの chiri_mesh絞り込み結果は400件です。
db=# SELECT COUNT(*) FROM chiri_mesh WHERE key_code like '533925%';
count
-------
400
こちら、chiri_mesh.shape
に外部参照が必要な可変長データがいくつも含まれているといった具合でしょうか。
ただ、それにしても CPU-Fallback が 0B というのは妙ですね。
Slackの方でアクセス情報を教えてもらえないでしょうか。
いくつかの問題が複合的に絡み合った問題でした。 ①st_crosses()がCPU-Fallbackを発生させるのは、再帰呼び出しに伴うGPUスタックの不足 ⇒スタック領域のサイズ設定のロジックを見直し。 ②GiST-JOIN時にCPU-Fallbackバッファへの書き込み処理が適切に行われていない ⇒CPU-Fallbackするように ③st_crosses()で本来 false を返すべき Polygon - Polygon の比較が、未定義値を返していた ⇒きちんとfalseを返すよう修正
現時点の最新版 3c6814440b9fc678c58fece0a49383dd83b52630
にて、エラーや永久的なループが発生しなくなることを確認しました。
今回のテストデータでは結果ゼロ件を得ましたが、これは ST_Crosses()がPolygonどうしの交叉をTrueとは判定しないためなので(そういうデータでした)、正常動作するようになったと判断します。
ST_Crosses()関数を使用したクエリを実行したところ、PG-Stromがクラッシュしました。
Query
クラッシュ時の画面出力内容
backtrace
Version
実行計画
EXPLAIN ANALYZEはクラッシュするので、参考になるか分かりませんが EXPLAINの結果: