Postgres:我可以创建一个在SELECT子句中使用的索引吗?

时间:2016-03-18 14:14:50

标签: postgresql select indexing

我已经定义了一个函数,该函数从表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)。

是否可以重新定义查询和/或索引以加快时区确定?

更新 谢谢你的答案!!我决定在最后为时区添加一个额外的列,并在创建/更新事件时填充它。

1 个答案:

答案 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子句,索引的值应该是你想要过滤的值。