【问题标题】:Postgres: Can I create an index to use in the SELECT clause?Postgres:我可以创建一个索引以在 SELECT 子句中使用吗?
【发布时间】:2016-03-18 14:14:49
【问题描述】:

我已经定义了一个函数,它从表 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) 的变体没有影响。

是否可以改写查询和/或索引以加快时区确定?

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

【问题讨论】:

  • 当您使用select 列表中的函数时,无法加快速度,因为 Postgres 需要为返回的每一行运行该函数

标签: postgresql select indexing


【解决方案1】:

我建议您为要在其中创建索引的选择部分创建一个本地临时表,然后在临时表上创建一个索引:

CREATE LOCAL TEMPORARY TABLE temp_table AS (
select
.
.
.
);
CREATE INDEX temp_table idx
  ON temp_table 
  USING btree
  (col1,col2,....);

否则,请编写您想要的 WHERE 条件,索引仅适用于 WHERE 子句,并且索引的值应该正是您要过滤的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2010-11-05
    相关资源
    最近更新 更多