sql >> データベース >  >> RDS >> PostgreSQL

Postgresがサブクエリをインライン化するのを防ぐにはどうすればよいですか?

    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の乱用は機能しなくなりました(そうです!)。



    1. MySQLにJSONデータを保存する方法

    2. PostgreSQLの計算/計算/仮想/派生列

    3. 通常のSQLServerサービスの事例を作成する

    4. MySQLで月の名前で注文する方法