3
SELECT col1, max(date) as max_date
FROM table
WHERE col1 ILIKE 'name'
GROUP BY col1

这里 col1 是数据类型varchar,日期是timestamp with time zone数据类型。所以创建了扩展CREATE EXTENSION pg_trgm

然后尝试了以下索引并得到了错误:

1:问题:错误:操作员类“gin_trgm_ops”不接受带时区的数据类型时间戳

CREATE INDEX CONCURRENTLY trgm_table_col1_date_index
ON table 
USING gin (provider_id, date gin_trgm_ops);

2:问题:错误:访问方法“gin”不存在操作员类“text_pattern_ops”

 CREATE INDEX CONCURRENTLY trgm_table_col1_date_index
    ON table 
    USING gin (provider_id, date text_pattern_ops);

如何为上述查询创建索引以加快执行速度?任何帮助将不胜感激!

编辑:所以这在语法上有效,但不会加快查询速度:

CREATE INDEX CONCURRENTLY trgm_provider_date_index
ON table 
USING gin (provider_id gin_trgm_ops, date_var) 
4

1 回答 1

1

据我所知,Postgres 无法使用 GIN 索引进行优化min()/查询。max()

可以通过安装contrib 模块将date列添加到 GIN 索引(以及其他标量类型,如inttext等) 。btree_gin然而,因为 GIN 索引方法没有义务以任何特定的顺序存储它们的条目,所以 Postgres 不能假设它们对查找最大值很有用,所以它们将被忽略。

(我在文档中找不到对此的具体引用,但我相信它与阻止使用 B 树以外的任何东西来优化 .)的限制ORDER BY相同。)

于 2018-01-24T11:42:32.220 回答