2015-12-15 9 views
5

は、次の表を検討し、タイムスタンプの日の部分:彼らはCREATION_TIMEを計算する必要があるため、次のようなのPostgreSQL:インデックス

 Column  |   Type   | 
--------------------+--------------------------+ 
id     | bigint     | 
creation_time  | timestamp with time zone | 
... 

クエリは、(ましてや、より複雑なJOIN)、かなりの時間がかかり::ためDATE各項目: - creation_time::DATE

SELECT creation_time::DATE, COUNT(*) FROM items GROUP BY 1; 

は、どのように私は、タイムスタンプの日の部分にインデックスを作成するのですか?

  • CREATE INDEX items_day_of_creation_idx ON items (creation_time)::date;
  • CREATE INDEX items_day_of_creation_idx ON items (creation_time::date);

しかし、両方が失敗しました::

私が試してみましたあなたは式がでなければならないという表現に索引を作成する場合

ERROR: syntax error at or near "::" 

答えて

4

かっこの間に入れる(列/式リストを囲むかっこに加えて、

CREATE INDEX items_day_of_creation_idx ON items ((creation_time::date)); 
+1

ありがとうございました。今度は 'ERROR:インデックス式の関数はIMMUTABLEとマークされていなければなりません。おかしい、日付の日の部分は、それが得る限り不変です。 –

+1

@AdamMatan:ああ、私はデータ型を見落としました。 'タイムゾーン付きタイムスタンプ 'から'日付 'への変換は、(タイムゾーンに依存するため)「不変」ではありません。これは 'タイムゾーンなしのタイムスタンプ 'を使用している場合にのみ有効です –

+0

インデックスで変換を行う方法はありますか? –

関連する問題