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

タイムスタンプのインデックス:インデックス式の関数はIMMUTABLEとしてマークする必要があります

    まず、これはCREATE INDEXのバグかもしれないと思いました 論理。ただし、重要なのは、textからのキャストです。 timestamptzへ それ自体はIMMUTABLEではありません また。 datestyleのような揮発性の設定に依存します 。

    あなたの特定のケースでは、あなたが試したものよりもさらに良い回避策があります。キャストを関数に移動します:

    CREATE OR REPLACE FUNCTION to_text(text) 
      RETURNS text AS
    $func$
    SELECT to_char($1::timestamptz AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US') 
    $func$ LANGUAGE sql IMMUTABLE;

    同じように効率的ですが、CREATE INDEX 吠えない:

    CREATE INDEX bar ON foo(to_text(j->>'start_time'));
    

    明らかに、それに応じて関数呼び出しを調整する必要があります。キャスト::timestamptzを削除します。 式から。 どこでも同じ設定を使用するようにしてください 、またはインデックスが誤った結果につながる可能性があります。

    さらに良い

    to_timestamp()で実際に不変の式を使用する キャストの代わりに(入力パターンで許可されている場合):

    CREATE OR REPLACE FUNCTION to_text(text) 
      RETURNS text AS
    $func$
    SELECT to_char(to_timestamp($1, 'YYYY-MM-DD"T"HH24:MI:SS.US')  -- adapt to your pattern
                AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.US') 
    $func$ LANGUAGE sql IMMUTABLE;

    ただし、注意してください(私のテストからのエラーメッセージを引用):

    "TZ" / "tz"/"OF"形式のパターンはto_dateではサポートされていません




    1. PostgreSQLのフォールトトレランスの進化

    2. SQLServer複数の行の挿入を処理するためのトリガー

    3. SQLテーブルのレコードをコピーして、新しい行の一意のIDを交換するにはどうすればよいですか?

    4. MySQLとPDO