今日のBQ謎仕様 : require_partition_filter = true なテーブル同士をJOINしつつフルスキャンしたい時
パーティショニングしていて、require_partition_filter = true のテーブル同士をJOINする場合を考える。 そのようなテーブルをフルスキャンする場合、
WHERE partitioning_field IS NOT NULL
ってやるが、これは JOIN するテーブルが一つまでだと動くが、2つ以上のテーブルを JOIN しようとするとエラーになる模様。 つまり、
FROM tbl1 LEFT JOIN tbl2 ON (...) WHERE tbl1.partitioning_field IS NOT NULL AND tbl2.partitioning_field IS NOT NULL
は動くけど、
FROM tbl1 LEFT JOIN tbl2 ON (...) LEFT JOIN tbl3 ON (...) WHERE tbl1.partitioning_field IS NOT NULL AND tbl2.partitioning_field IS NOT NULL AND tbl3.partitioning_field IS NOT NULL
は「tbl3 は partitioning_field で絞んないとクエリできまへん」と怒られる。理不尽...
こういう場合は、WITH句で各テーブルを WHERE partitioning_field IS NOT NULL してから JOIN する必要がある。(メンドイ...)
なお、パーティションを明示的に絞れば動くようだ。 つまりこれは動く。
FROM tbl1 LEFT JOIN tbl2 ON (...) LEFT JOIN tbl3 ON (...) WHERE tbl1.partitioning_field = "2021-01-01" AND tbl2.partitioning_field = "2021-01-01" AND tbl3.partitioning_field = "2021-01-01"
2022-01-30 追記
ON 句でパーティションを絞ると動く。
つまり、これは動く。
FROM tbl1 LEFT JOIN tbl2 ON (... AND tbl2.partitioning_field IS NOT NULL) LEFT JOIN tbl3 ON (... AND tbl3.partitioning_field IS NOT NULL) WHERE tbl1.partitioning_field IS NOT NULL