我有一个名为场PostgreSQL的表data
是jsonb
有大量的对象,我想打一个索引,以加快查询。我正在使用几行来测试数据(仅15行),但我不想将来出现查询问题。我正在从Twitter API获取数据,所以一周的时间我会收到大约10gb的数据。
如果我做正常的索引
CREATE INDEX ON tweet((data->>'created_at'));
如果输入以下内容,则会得到文本索引:
Create index on tweet((CAST(data->>'created_at' AS timestamp)));
我懂了
ERROR: functions in index expression must be marked IMMUTABLE
我试图使它设置时区“不变”
date_trunc('seconds', CAST(data->>'created_at' AS timestamp) at time zone 'GMT')
但我仍然遇到“不可变”错误。那么,如何从JSON完成时间戳索引?我知道我可以用日期做一个简单的列,因为它可能在时间中保持不变,但是我想学习如何做。
索引中也不允许该表达式:
(CAST(data->>'created_at' AS timestamp) at time zone 'UTC')
它不是一成不变的,因为第一次转换取决于您的DateStyle
设置(除其他事项外)。函数调用后无助于将结果转换为UTC ,不确定性已经悄悄蔓延到...
该溶液是一个函数,使通过固定时间段(如铸造不可改变@a_horse已经暗示)。
我建议使用to_timestamp()
代替强制转换(也不是强制转换IMMUTABLE
)来排除某些麻烦源-DateStyle
成为一个。
CREATE OR REPLACE FUNCTION f_cast_isots(text)
RETURNS timestamptz AS
$$SELECT to_timestamp($1, 'YYYY-MM-DD HH24:MI')$$ -- adapt to your needs
LANGUAGE sql IMMUTABLE;
请注意,这将返回timestamptz
。然后:
CREATE INDEX foo ON t (f_cast_isots(data->>'created_at'));
此相关答案中对此技术的详细说明:
有关的:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句