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

PostgreSQLの式インデックスの実際的な制限

    hstoreで遊んだことはありませんが、EAV列が必要な場合は、同様のことを行います。例:

    create index on product_eav (eav_value) where (eav_type = 'int');
    

    そうすることの制限は、それを利用するためにあなたのクエリで明示的である必要があるということです、すなわち、このクエリは上記のインデックスを利用しません:

    select product_id
    from product_eav
    where eav_name = 'size'
    and eav_value = :size;
    

    しかし、これは次のようになります:

    select product_id
    from product_eav
    where eav_name = 'size'
    and eav_value = :size
    and type = 'int';
    

    あなたの例では、おそらく次のようになっているはずです:

    create index on product ((data->'size')::int) where (data->'size' is not null);
    

    これにより、サイズのエントリがない場合にインデックスへの参照を追加することを回避できます。使用しているPGのバージョンによっては、次のように変更する必要があります。

    select product_id
    from products
    where data->'size' is not null
    and data->'size' = :size;
    

    通常のインデックスと部分インデックスのもう1つの大きな違いは、後者はテーブル定義に一意の制約を適用できないことです。これは成功します:

    create unique index foo_bar_key on foo (bar) where (cond);
    

    以下はしません:

    alter table foo add constraint foo_bar_key unique (bar) where (cond);
    

    しかし、これは次のようになります:

    alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);
    



    1. PostgreSQLでONCONFLICTを使用してRETURNINGを使用するにはどうすればよいですか?

    2. MYSQLでランクを生成するための最良の方法は何ですか?

    3. QMYSQLドライバーがQT5.2にロードされないのはなぜですか?

    4. MySQLの列名の最大長