OFFSET 0
だと思います 何か奇妙なことが起こっていることを示すハックであることが明らかであり、OFFSET 0
周辺のオプティマイザーの動作を変更する可能性は低いためです。 ...wherasうまくいけばCTEはある時点でインライン化されるでしょう CTEは、PostgreSQL 12でデフォルトでインライン化できなくなりました。以下の説明は、完全を期すためのものです。 Seamusの答えを使用してください。
相関のないサブクエリの場合、可能 PostgreSQL11以前のインラインWITH
の拒否を悪用する クエリ用語をクエリして次のように言い換えます:
WITH t AS (
SELECT * FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad')
)
SELECT COUNT(*)
FROM t
WHERE data ? 'building_floorspace'
AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];
これは、OFFSET 0
とほぼ同じ効果があります ハックして、offset 0
のように hackは、Pgのオプティマイザーの癖を悪用して、Pgのクエリヒントの欠如を回避します...クエリヒントとして使用します。
ただし、OFFSET 0
ハックはある程度公式に祝福されていますが、PostgreSQL 12ではCTEの乱用は機能しなくなりました(そうです!)。