PostgreSQLの驚き:CTE、DELETE、LIMITの予期せぬ挙動
2025-05-04
バッチ処理のためにCommon Table Expression (CTE)とDELETE...RETURNING、LIMITを組み合わせたPostgreSQLで、予期せぬ挙動が発生しました。1行だけ削除するつもりでしたが、複数行が削除されました。`EXPLAIN ANALYZE`で、ネストしたループ半結合の最適化が行われ、LIMIT 1句が複数回実行されていることが判明しました。解決策は、クエリを再構成し、CTEを避け、DELETEのWHERE句に直接サブクエリを使用することでした。これは、CTEが常にクエリプランの最適化を防ぐとは限らないこと、重要な操作ではプランを注意深く調べる必要があることを示しています。
開発