我已经定义了一个函数,该函数从表tz_world中为一组lon,lat值确定时区:
create function get_timezone(numeric, numeric)
returns character varying(30) as $$
select tzid from tz_world where ST_Contains(geom, ST_MakePoint($1, $2));
$$ language SQL immutable;
现在我想在另一个表的查询的SELECT子句中使用此函数:
select get_timezone(lon, lat) from event where...;
该功能相当慢,所以我尝试使用索引来加快速度:
create index event_timezone_idx on event (get_timezone(event.lon, event.lat));
虽然这加快了在WHERE子句中使用该函数的查询,但它对上面的变量没有影响,其中在SELECT子句中使用了get_timezone(lon,lat)。
是否可以重新定义查询和/或索引以加快时区确定?
更新 谢谢你的答案!!我决定在最后为时区添加一个额外的列,并在创建/更新事件时填充它。
答案 0 :(得分:0)
我建议您创建一个本地临时表,其中包含要在其中创建索引的select部分,然后在临时表上创建索引:
CREATE LOCAL TEMPORARY TABLE temp_table AS (
select
.
.
.
);
CREATE INDEX temp_table idx
ON temp_table
USING btree
(col1,col2,....);
否则写下你想要的WHERE条件,索引只适用于WHERE子句,索引的值应该是你想要过滤的值。